新建代码库
- git init 在当前目录新建一个Git代码库
- git init [project-name] 新建一个目录,将其初始化为Git代码库
- git clone [url] 下载一个项目和它的整个代码历史。注意此时下载的就是项目的所有提交代码,并且clone下来就是最新的。
配置
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
- git config --list 显示当前的Git配置
- git config [--global] user.name "[name]" 设置提交代码时的用户的用户名
- git config [--global] user.email "[email address]" 设置提交代码时的用户的邮箱
增加/删除文件
- git add 文件1 文件2 添加指定文件到暂存区
- git add 文件夹名称 添加指定目录到暂存区,包括子目录
- git add . 添加所有修改的文件
提交代码
- git commit -m "本次提交的描述"
分支
- git branch 查看本地的所有分支
- git branch -r 查看远程的所有分支
- git branch -a 查看本地和远程所有的分支
- git branch 新的分支名称 新建一个分支,但依然停留在当前分支
- git checkout -b 新的分支名称 新建一个分支,并且切换到新创建的分支,注意这种情况默认是在当前分支的最新提交的一次进行 checkout 新的分支。
- git branch 新的分支 [某次提交]
git checkout -b dev3 02a7610fea1dc236841f589358337a05c52ef9b6 - git branch --track [branch] [remote-branch] 不太懂,用时再说
- git checkout - 切换到上一个分支
- git merge [branch] 合并指定分支到当前分支,就是把别的分支的代码合并到当前分支上去。
- git branch -d [branch-name] 删除本地分支,不能删除当前所在的分支。需要先切换出去,再删除当前的分支。
- git push origin --delete [branch-name] 删除远程分支
标签
标签总的来说就是一个标记,其实就是将commit 一堆不好记的东西标签化,通俗好认识化。
- git tag 列出所有的标签
- git tag [tag] 新建一个tag在当前commit,也就是在当前提交的代码上面打标签,当然是在当前的分支
- git tag [tag] [commit] 新建一个tag在指定commit
- git tag -d [tag] 删除本地tag
- git push origin :refs/tags/[tagName] 删除远程tag
- git show [tag] 查看tag信息
git show "v3.0"显示某个tag的里面的代码变动,其实可以理解为某个commit对应的代码变动 - git push [remote] [tag] 提交指定tag
git push origin "v3.0" - git push [remote] --tags 提交所有tag
git push origin --tags前面的 [remote] 其实就代表的是 远程分支的名称,实例使用的远程默认分支 orogin ,origin 其实就相当于一个git 地址。 - git checkout -b [branch] [tag] 新建一个分支,指向某个tag,其实就是新建一个分支,指向某次commit 一个效果。
远程同步
- git remote -v 显示所有远程仓库
- git fetch [remote] 下载远程仓库的所有变动,不只是当前的分支,包括所有的分支。所有的tags都会获取。
git fetch origin - git fetch origin [branch] 下载远程仓库某个分支
git fetch origin main下载远程main 分支的代码 - git remote add [shortname] [url] 添加一个远程仓库,使用举例子
git remote add origin git地址添加一个远程仓库地址。 - git pull [remote] [branch]
git pull origin devgit pull 和git fetch 的区别,看下面 - git push [remote] [branch]
git push origin dev是将本地的某个分支推送到远端,如果就是推送当前的分支,可以不写dev分支,直接用git push origin他会自动推到本地当前的分支,如果是在当前分支,要推其他分支的,可以在最后加上分支名称。 - git push [remote] --force 强行推送当前分支到远程仓库,即使有冲突
- git push [remote] --all 推送所有分支到远程仓库
关联本地仓库和远程仓库
首先要 git remote add [shortname] [url] 添加一个仓库,然后将第一次将本地仓库推送到远程的时候需要在推送的参数 -u,让你的本地仓库和远程仓库进行关联。 -u 参数相当于是让你本地的仓库和远程仓库进行了关联。 git push -u origin --all 这代表是将本地已存在的git项目的所有分支推送到远程仓库名为origin的仓库。 git push -u origin main 只推送main分支到远程仓库
git pull 和 git fetch 的区别
1.目的不同
git fetch:从远程获取最新版本到本地,但不会自动 merge,用于从远程跟踪分支下载和查看其他人完成的最新提交,但不将这些提交合并到本地存储库中。它从远程存储库中获取更改并将其存储在本地存储库中。
git pull:从远程获取最新版本并 merge 到本地,它会自动将提交合并到您的本地存储库中,而无需查看提交。
2.安全性不同
git fetch:git fetch是一个更安全的选择,因为它从你的远程仓库拉入所有的提交,但不会对你的本地文件做任何修改。这给了你足够时间去发现远程仓库自从你上次拉取后到现在为止发生的变化。你可以在合并前检查哪些文件有变化,哪些文件可能导致冲突。
git pull:git pull相当于运行git fetch,然后立即将你的改动合并到本地仓库。这样的确少了一个步骤,但是也会带来一些风险。
撤销
-
git checkout [file] 恢复暂存区的指定文件到工作区
-
git checkout . 恢复暂存区的所有文件到工作区
-
git checkout [commit] [file] 恢复某个commit的指定文件到暂存区和工作区 总结:checkout 是暂存区和工作区的之间的恢复
-
git reset [file] 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
-
git reset --hard 重置暂存区与工作区,与上一次commit保持一致
-
git reset [commit] 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
-
git reset --hard [commit] 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
查看信息
- git status 显示有变更的文件
- git log 显示当前分支的版本历史
其他东西
远程名称(Remote Name)
在 Git 中,其实无论是 origin,还是 upstream 并没有特殊的含义,但由于被广泛使用,因此它们有了约定俗成、众所周知的含义。
就好比如说,在现实世界中小明、小红是再普通不过的名字,但由于在小学语文课本的对话中常被作为男一女一,用于表示对话的两个人而已,并没有特别的意义在里面。而在技术博文中,经常可以看到使用 foo、bar 作为变量标识符举例,它们就相当于语文课本中的小明、小红一样。那么本文接下来要讨论的 origin、upstream 等也是同样的道理。
先来个餐前菜...
如果我跟你说,以下两条命令是完全等效的,你是不是就差不多猜得出 origin 表示什么了?
git push origin main
git push git@github.com:toFrankie/repo-demo.git main
更完整的文章 developer.aliyun.com/article/919…
git switch 命令和 git checkout 的区别?
git 的rebase、reset、revert区别?
我现在错误提交了几次到远程的分支,我想去掉这几次的提交,该如何操作?
如果你在 Git 中错误地提交了几次并推送到了远程分支,你可以通过以下几种方法来去掉这些提交:
方法 1:使用 git reset 来撤销最近的提交
如果你只是想撤销最近几次的提交(包括已经推送到远程的提交),并且不保留这些提交,可以使用 git reset 命令。
如果你在 Git 中错误地提交了几次并推送到了远程分支,你可以通过以下几种方法来去掉这些提交:
方法 1:使用 git reset 来撤销最近的提交
如果你只是想撤销最近几次的提交(包括已经推送到远程的提交),并且不保留这些提交,可以使用 git reset 命令。
步骤:
-
查看提交历史:
git log找到你想撤销的提交的哈希值(commit hash),例如
abc123。 -
使用
git reset回退到某个提交:-
如果你希望保留本地的更改(不删除更改),可以使用
--soft选项:git reset --soft <commit_hash>这会将提交历史回退到
<commit_hash>,并保留所有更改在暂存区。 -
如果你不希望保留本地更改(即完全丢弃这些提交),可以使用
--hard选项:git reset --hard <commit_hash>这会将提交历史回退到
<commit_hash>,并且所有更改都会被删除。
-
-
强制推送到远程仓库: 由于你已经推送过这些提交到远程仓库,现在需要强制推送才能覆盖远程的历史记录:
git push origin <branch_name> --force
注意:
--force推送会覆盖远程分支的历史记录,可能会影响其他协作开发者。如果多人协作开发,强制推送前一定要沟通清楚。- 如果你不确定是否会影响别人,考虑使用
git push --force-with-lease,它更加安全一些,只有当远程仓库的历史没有被别人更新时才会强制推送。
方法 2:使用 git rebase 交互式变基
如果你希望更加精确地选择哪些提交要去掉,而不仅仅是回退到某个特定的提交,你可以使用交互式变基。
步骤:
-
开始交互式变基:
git rebase -i HEAD~n其中,
n是你想回退的提交次数。例如,如果你想去掉最近的 3 次提交,则输入HEAD~3。 -
选择要删除的提交: 会打开一个编辑器,列出最近的提交记录。每个提交前面都有一个
pick,表示保留该提交。你可以将pick改成drop来删除某个提交,或者将多个提交合并(squash)成一个。pick <commit_hash_1> <commit_message_1> drop <commit_hash_2> <commit_message_2> pick <commit_hash_3> <commit_message_3> -
保存并退出: 修改完成后,保存并退出编辑器。Git 会自动应用变基操作。
-
强制推送到远程仓库: 和上面一样,你需要强制推送到远程仓库:
git push origin <branch_name> --force
总结
- 如果你只想回退到某个提交并删除后面的所有提交,
git reset --hard <commit_hash>是最直接的方式。 - 如果你想精确选择哪些提交去掉,可以使用
git rebase -i进行交互式变基。
需要注意的是,强制推送可能会影响其他开发者,确保在团队中达成一致后再执行这些操作。