动图讲解Git常用命令


原文在这里,CS Visualized: Useful Git Commands。通过动图展示了不同Git命令的效果,这里做下笔记。

Meiging

git merge: 将一个branch的变动反应到另一个branch。这个有两种模式,fast-forward, no-fast-forward。

Fast-forward (--ff)

发生场景:当前master branch落后,没有额外的commit,而dev branch有新的commit。

这个是git merge的默认模式,执行这个模式部会产生一个新的commit,而是把合并的branch的commit拿来到当前的branch。

git merge

比如上面的效果就是直接把dev branch的commit合并到了当前的master branch。而这个合并行为本身没有产生新的commit。

No-fast-foward (--no-ff)

发生场景:master branch和dev branch 各自都有一些commit。这种场景还是很常见的。

这种模式会产生一个新的commit。

git merge

Merge Conflicts

上面两种情况都是在两个branch的commit里没有冲突的前提下才会执行的。

如果有冲突,就需要解决冲突了。比如下面我们要将dev合并到master。

下面是示意图。合并如何有矛盾,Git会提示我们。然后我们可以手动去更改有冲突的文件。冲突的部分已经被Git会不同标识标注出来了。

git merge

Rebasing

使用场景:当前在dev进行开发,而master那边有了新的commit,使用git rebase master可以把当前的dev的commit,复制到master最新的commit上。比如说我们在dev开发一个功能,而master那边做了重要更新,所以我们用这种方式直接获取master的所有更新。这样可以防止在将来产生merge conflict。

git rebase

与merge不同,有冲突的时候,rebase不会去检查哪些文件保留,哪些删除。这个会完全保留master上的变更,如果dev上有冲突的话,那就坑了,我们在dev上的变更全没了。所以这个方法不适合用于merge conflicts。

而且这种方法会产生一个commit

Interactive Rebase

因为上面默认的rebase会变更当前branch所有冲突的地方,所以Git提供了一些选项让我们能对某些commit直接做一些更高。

下面是6个可以用于commit的rebase操作:

  • reword: Change the commit message
  • edit: Amend this commit
  • squash: Meld commit into the previous commit
  • fixup: Meld commit into the previous commit, without keeping the commit’s log message
  • exec: Run a command on each commit we want to rebase
  • drop: Remove the commit

下面的git rebase -i HEAD~3的意思是,以Interactive模式,打开最近的3个commit,最新的commit在最下面。然后可以在vim里更改前面的pick为drop,这里的修改是把第3个commit抛弃了,这样的话,最新的两个commit的hash值也会变化。

下面是合并两个commit的方法。

Interactive Rebase 的命令还是挺麻烦的,容易搞错。

Resetting

使用场景:提交的commit有问题,我们不想要这个commit

Soft reset

将HEAD指针移动到之前的某个commit,但不删除最新的commit。

git reset --soft

通过git status可以查看所有变更的情况。

Hard reset

不保留HEAD指针之后的新commit。

git reset --hard

Reverting

相当于Undo某个commit,比如在ec5be提交的变更,我们可以通过git revert来undo这个变更。

git revert

Cherry-picking

使用场景:引入dev中某个commit的变更,到master里。注意,只是单个commit的变更,而不是整个dev branch的变更。

git cherry-picking

Remote Branch

Fetching

使用场景:将remote branch上的commit变更,添加到local branch上。注意HEAD指针没有改变。然后我们可以在本地上查看所有更新,然后决定要不要更新到最新的commit上。

git fetch

Pulling

使用场景:直接将remote上的变化更新到local branch上。相当于git fetch + git merge

git pull

Reflog

使用场景:查看所有执行过的Git命令,如果我们出错的话,方便我们回到之前的某个commit。

下面是一个例子:

git reflog

比如我们不想merge origin branch。我们可以通过git reflog查看当前情况,然后把HEAD指针回到之前没有merge的commit上。

欢迎订阅我的博客:RSS feed
知乎: 赤乐君
Blog: BrambleXu
GitHub: BrambleXu
Medium: BrambleXu

参考资料


文章作者: BrambleXu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 BrambleXu !
评论
  目录