如果你正在使用Git,但是经常疑惑为什么有些命令达不到期望的结果,那么这篇文章你需要仔细看。对Git新手来说,按照这篇文章列出的用例按图索骥,也足以满足你日常工作的需要了。
首先列出一个经典的Git Flow,大部分命令都是有使用条件的,只有在满足使用条件的情况下,这些命令才会得到期望的结果,不同的条件下,你需要使用不同的命令。
下面就从现实需求的角度来介绍一些主要命令,这些用例基本覆盖了你日常工作最可能遇到的情况。撤销与清除是同一个意思
需 求 | Git 命令 | |
1 | 添加本项目下所有的修改(含新增文件、新增目录)到暂存区 | Git add --all |
2 | 撤销所有的没有staged过的,但是这些文件\目录已经被Git跟踪过了 | Git checkout . Git restore . |
3 | 撤销新增的文件和文件夹,没有进入staged,也从未进入git的 | Git clean -df |
4 | 进入暂存区,但还没有commit,想撤销这些已暂存的所有修改,回到未修改状态,清空暂存区和工作区 | Git reset --hard |
5 | 撤销提交到暂存区的修改, 修改内容恢复到工作区 | Git reset |
6 | 如果已经提交到本地仓库,想撤回这些内容(回滚一次),修改的内容仅恢复到工作区。暂存区和本地仓库则是本次提交之前的断面。 如果使用--hard, 则工作区,暂存区和本地仓库则全部恢复到本次提交之前的那个断面 | Git reset –-soft HEAD~1 |
7 | 只有远程库比本地库超前(远程库有更多提交)的时候才起作用,才会用远程的断面来覆盖本地的所有断面(要求暂存区和工作区没有未提交的变化,如果暂存区或者工作区有改变,需要先用2, 3, 4处理) | Git pull |
8 | git diff检查的是工作区与暂存区之间的差 | Git diff |
还有一种情况,如果我们使用forked repository的模式,看下图,在我们的本地所做的修改想提交到Origin,然后再从Origin上提交pull Request来合并自己的代码到Upstream的main分支的时候,upstrea上的main分支已经有很多提交了,这种情况如何处理呢?
假设我们想把我们本地的feature/My_Working_Feature 上的修改,合并到Upstream上的main分支,分两种情况:
1. 如果创建fork 仓库的时候有自动同步选项,比如下图所示,这种情况下Upstream会向Origin自动更新
于是我们要做的步骤依次如下:
a. git checkout main
b. git pull
c. git checkout feature/My_Working_Feature
d. git merge main
e. git push origin feature/My_Working_Feature
然后在Origin上向Upstream提交pull request,把My_Working_Feature合并到Upstream上的main分支
2. 如果Upstream无法向Origin自动更新
你需要执行一次:
git remote add upstream url of your Upstream repo
然后:
a. git checkout main
b. git pull Upstream/main
(b') git push origin main----(可选,主要是用来同步upstream与Origin)
c. git checkout feature/My_Working_Feature
d. git merge main
e. git push origin feature/My_Working_Feature
然后在Origin上向Upstream提交pull request,把My_Working_Feature合并到Upstream上的main分支
上述采用merge的方式来合并,还有一种rebase的模式也可以合并。有时间再将git rebase命令
把上述内容搞清楚,你就可以很好地应付你的日常工作了。