Git常用操作总结
Posted 楚兴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git常用操作总结相关的知识,希望对你有一定的参考价值。
文章目录
- 修改最近一次的提交
- 取消最近一次提交
- 合并其他分支的某一次commit
- 用 `rebase -i` 修改提交
- 用`rebase -i`汇合提交
- 用 `git rebase` 合并分支
- 用`git merge -–squash`合并分支
修改最近一次的提交
# 修改你的代码
$ git add .
$ git commit --amend
取消最近一次提交
# 正常的写代码
$ git aad .
$ git commit -m "add a feature"
$ git revert HEAD
合并其他分支的某一次commit
$ git checkout v2.0分支
$ git cherry-pick 38361a55 # 38361a55 这个commmit位于v3.0分支中
如果发生冲突,则手动解决冲突,然后:
git add .
git commit
用 rebase -i
修改提交
- 将当前分支无关的工作状态进行暂存
git stash
- 将 HEAD 移动到需要修改的 commit 上
git rebase -i 9633cf0919^
- 找到需要修改的 commit ,将首行的
pick
改成edit
- 开始着手解决你的 bug
git add
将改动文件添加到暂存git commit –amend
追加改动到提交git rebase –continue
移动 HEAD 回最新的 commit- 恢复之前的工作状态
git stash pop
如果只想修改commit消息,可使用:git commit --amend
用rebase -i
汇合提交
- 我们来合并最近的3次提交纪录,执行:
git rebase -i HEAD~4
- 这时候,会自动进入vi编辑模式:
pick 1eadf40 add first
pick 2d28dcf add second
pick 819b84b add third
pick 6edbf3a add fourth
# Rebase ae14a33..6edbf3a onto 6edbf3a (4 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
有几个命令需要注意一下:
- p, pick = use commit
- r, reword = use commit, but edit the commit message
- e, edit = use commit, but stop for amending
- s, squash = use commit, but meld into previous commit
- f, fixup = like “squash”, but discard this commit’s log message
- x, exec = run command (the rest of the line) using shell
- d, drop = remove commit
按照如上命令来修改你的提交纪录:
p 1eadf40 add first
s 2d28dcf add second
s 819b84b add third
s 6edbf3a add fourth
- 如果保存的时候,你碰到了这个错误:
error: cannot 'squash' without a previous commit
注意不要合并先前提交的东西,也就是已经提交远程分支的纪录。
- 如果你异常退出了 vi 窗口,不要紧张:
git rebase --edit-todo
这时候会一直处在这个编辑的模式里,我们可以回去继续编辑,修改完保存一下:
git rebase --continue
- 查看结果
git log
用 git rebase
合并分支
- 我们先从 master 分支切出一个 dev 分支进行开发;
- 这时候,你的同事完成了一次 hotfix,并合并入了 master 分支,此时 master 已经领先于你的 feature1 分支了;
- 使用 rebase 合并 master分支,执行命令:
git:(feature1) git rebase master
注意:执行 git rebase master
是如果冲突了,则需要手动解决冲突,然后执行:
git add .
git rebase --continue
rebase
做的事情:
- git 会把 feature1 分支里面的每个 commit 取消掉;
- 把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;
- 把 feature1 分支更新到最新的 master 分支;
- 把上面保存的 patch 文件应用到 feature1 分支上;
用git merge -–squash
合并分支
Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如:
$ git merge another
$ git checkout another
# modify, commit, modify, commit ...
$ git checkout master
$ git merge another
但是,操作方便并不意味着这样操作就是合理的,在某些情况下,我们应该优先选择使用–squash选项,如下:
$ git merge --squash another
$ git commit -m "message here"
--squash
选项的含义是:本地文件内容与不使用该选项的合并结果相同,但是不提交、不移动HEAD,因此需要一条额外的commit命令。其效果相当于将another分支上的多个commit合并成一个,放在当前分支上,原来的commit历史则没有拿过来。
判断是否使用--squash
选项最根本的标准是,待合并分支上的历史是否有意义。
如果在开发分支上提交非常随意,甚至写成微博体,那么一定要使用--squash
选项。版本历史记录的应该是代码的发展,而不是开发者在编码时的活动。
只有在开发分支上每个commit都有其独自存在的意义,并且能够编译通过的情况下(能够通过测试就更完美了),才应该选择缺省的合并方式来保留commit历史。
参考来源:
- https://backlog.com/git-tutorial/cn/stepup/stepup7_6.html
- https://alpha-blog.wanglianghome.org/2010/08/05/git-merge-squash/
- http://jartto.wang/2018/12/11/git-rebase/
以上是关于Git常用操作总结的主要内容,如果未能解决你的问题,请参考以下文章