Git常用操作总结

Posted 楚兴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git常用操作总结相关的知识,希望对你有一定的参考价值。

文章目录

修改最近一次的提交

# 修改你的代码
$ 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 修改提交

  1. 将当前分支无关的工作状态进行暂存
git stash
  1. 将 HEAD 移动到需要修改的 commit 上
git rebase -i 9633cf0919^
  1. 找到需要修改的 commit ,将首行的 pick 改成 edit
  2. 开始着手解决你的 bug
  3. git add 将改动文件添加到暂存
  4. git commit –amend 追加改动到提交
  5. git rebase –continue 移动 HEAD 回最新的 commit
  6. 恢复之前的工作状态
git stash pop

如果只想修改commit消息,可使用:git commit --amend

rebase -i汇合提交

  1. 我们来合并最近的3次提交纪录,执行:
git rebase -i HEAD~4
  1. 这时候,会自动进入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
  1. 如果保存的时候,你碰到了这个错误:
error: cannot 'squash' without a previous commit

注意不要合并先前提交的东西,也就是已经提交远程分支的纪录。

  1. 如果你异常退出了 vi 窗口,不要紧张:
git rebase --edit-todo

这时候会一直处在这个编辑的模式里,我们可以回去继续编辑,修改完保存一下:

git rebase --continue
  1. 查看结果
git log

git rebase 合并分支

  1. 我们先从 master 分支切出一个 dev 分支进行开发;
  2. 这时候,你的同事完成了一次 hotfix,并合并入了 master 分支,此时 master 已经领先于你的 feature1 分支了;
  3. 使用 rebase 合并 master分支,执行命令:git:(feature1) git rebase master

注意:执行 git rebase master 是如果冲突了,则需要手动解决冲突,然后执行:

git add .
git rebase --continue

rebase 做的事情:

  1. git 会把 feature1 分支里面的每个 commit 取消掉;
  2. 把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;
  3. 把 feature1 分支更新到最新的 master 分支;
  4. 把上面保存的 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历史。

参考来源:

  1. https://backlog.com/git-tutorial/cn/stepup/stepup7_6.html
  2. https://alpha-blog.wanglianghome.org/2010/08/05/git-merge-squash/
  3. http://jartto.wang/2018/12/11/git-rebase/

以上是关于Git常用操作总结的主要内容,如果未能解决你的问题,请参考以下文章

git常用操作命令

git 常用操作总结

Git原理及常用操作命令总结

Git常用操作总结

Git常用操作指南

常用 Git 命令总结