Git之工作中经常使用的命令(git merge/git revert/git rebase)

git基本命令

git status  #本地查看文件提交状态
git add test.txt #将工作区的代码存储到暂存区
git commit -m "commit message" test.txt (解决冲突后不能带文件名提交)  #将暂存区代码存储到本地库
git rm --cache test.txt  #将文件从暂存区中删除,即该文件不使用git追踪
git log #查看具体的日志信息  
git log --pretty=online #查看完整的哈希码
git log --oneline #查看简写的哈希码 
git reflog #查看所有的日志记录
git reset --hard/soft/mixed #重置
git diff HEAD^ test.txt #比较文件,不带文件名比较多个文件
git diff test.txt #比较工作区和暂存区文件
git branch -v  #查看所有分支
git branch fix_bug #创建分支
git checkout fix_bug #切换分支
git merge fix_bug #合并分支
git remote -v #查看远程分支
git remote add origin https://,... #为远程分支添加别名
git push origin master #将master分支推送到origin远程分支
git clone https://....  #相当于为remote仓库创建了一个别名并初始化git并复制了远程源代码
git pull origin master  #= git fetch origin master+git merge origin/master(在master分支上)

git问题

1.git 指令在线练习
2.git reset 、git revert和git rebase的区别
  • git reset 移动HEAD到当前分支的一个commit,可以撤销当前分支的一些commit,如果回退了,后面的分支记录将在下一次git gc之后回收了
  • git checkout 不同于git reset,git checkout不会丢弃任何一次提交,对于查看某个历史版本的代码非常有用。但如果在checkout某个历史版本后如果再次提交就无法返回原先的状态,因此在修改提交时应该创建一个新的分支
  • git revert 通过创建一次新的提交来撤销历史的提交记录,这种提交是安全的,因为不会修改历史记录
3.git merge 和git rebase区别

git merge在合并时会生成一个新的提交,是将两分支的共同祖先、两分支的最新提交记录做一个三方合并:Git之工作中经常使用的命令(git merge/git revert/git rebase)_第1张图片
Git之工作中经常使用的命令(git merge/git revert/git rebase)_第2张图片

git rebase将两分支共同祖先之后当前分支的所有提交记录暂时提取出来,放在要变基的分支之后:
Git之工作中经常使用的命令(git merge/git revert/git rebase)_第3张图片
Git之工作中经常使用的命令(git merge/git revert/git rebase)_第4张图片

4.git rebase 详解

git rebase -i的基本命令(参考:https://www.jianshu.com/p/4a8f4af4e803)

注意:不要在公共分支上进行rebase操作!

  1. 合并多个commit为一个
    如下图,希望把BCD三个合并成B‘
    Git之工作中经常使用的命令(git merge/git revert/git rebase)_第5张图片
    现在有四次提交记录
    Git之工作中经常使用的命令(git merge/git revert/git rebase)_第6张图片
    在这里使用命令:
git rebase -i  [startpoint]  [endpoint]

其中-i的意思是–interactive,即弹出交互式的界面让用户编辑完成合并操作。[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。

于是

git rebase -i 36224db
#或
git rebase -i HEAD~3 

我们会看到
Git之工作中经常使用的命令(git merge/git revert/git rebase)_第7张图片
上面未被注释的部分列出的是我们本次rebase操作包含的所有提交,下面注释部分是git为我们提供的命令说明。每一个commit id 前面的pick表示指令类型,git 为我们提供了以下几个命令:

  • pick
    表示该分支会提交,可以用来修改提交的顺序,可缩写成:p
  • reword
    与Pick相似,提交的内容不会变,但是每次提交时可以重新修改提交的messgae(缩写:r)
  • edit
    有机会修改提交,可以添加或者更改提交,使用git rebase --continue继续变基(缩写:e)
  • squash
    合并多条提交记录为最新的一条,并提供机会重新编辑多个提交的message(缩写:s)
  • fixup
    同squash,但是丢弃合并的多条message,以历史最早版本的message作为合并后的message(缩写:f)
  • exec
    执行shell脚本(缩写:x)
  • drop
    删除某条提交记录(缩写:d)

于是:在这里插入图片描述
接着进入消息修改界面
Git之工作中经常使用的命令(git merge/git revert/git rebase)_第8张图片
编辑完保存即可完成commit的合并了:
Git之工作中经常使用的命令(git merge/git revert/git rebase)_第9张图片

  1. 将某一段commit粘贴到另一个分支上
    当我们项目中存在多个分支,有时候我们需要将某一个分支中的一段提交同时应用到其他分支中,就像下图:
    Git之工作中经常使用的命令(git merge/git revert/git rebase)_第10张图片
    我们希望将develop分支中的C~E部分复制到master分支中,这时我们就可以通过rebase命令来实现(如果只是复制某一两个提交到其他分支,建议使用更简单的命令:git cherry-pick)。
    使用命令的形式为:
    git rebase   [startpoint]   [endpoint]  --onto  [branchName]

其中,[startpoint] [endpoint]仍然和上一个命令一样指定了一个编辑区间(前开后闭),–onto的意思是要将该指定的提交复制到哪个分支上。
所以,在找到C(90bc0045b)和E(5de0da9f2)的提交id后,我们运行以下命令:

    git  rebase   90bc0045b^   5de0da9f2   --onto master

注:因为[startpoint] [endpoint]指定的是一个前开后闭的区间,为了让这个区间包含C提交,我们将区间起始点向后退了一步。
运行完成后查看当前分支的日志:
Git之工作中经常使用的命令(git merge/git revert/git rebase)_第11张图片
可以看到,C~E部分的提交内容已经复制到了G的后面了,分支状态可以看见当前head处理游离态:
在这里插入图片描述
实际上,此时所有分支的状态应该是这样:
Git之工作中经常使用的命令(git merge/git revert/git rebase)_第12张图片
虽然此时HEAD所指向的内容正是我们所需要的,但是master分支是没有任何变化的,git只是将C~E部分的提交内容复制一份粘贴到了master所指向的提交后面,我们需要做的就是将master所指向的提交id设置为当前HEAD所指向的提交id就可以了,即:

      git checkout master
      git reset --hard  0c72e64

你可能感兴趣的:(git)