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 rebase将两分支共同祖先之后当前分支的所有提交记录暂时提取出来,放在要变基的分支之后:
4.git rebase 详解
git rebase -i的基本命令(参考:https://www.jianshu.com/p/4a8f4af4e803)
注意:不要在公共分支上进行rebase操作!
- 合并多个commit为一个
如下图,希望把BCD三个合并成B‘
现在有四次提交记录
在这里使用命令:
git rebase -i [startpoint] [endpoint]
其中-i的意思是–interactive,即弹出交互式的界面让用户编辑完成合并操作。[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
于是
git rebase -i 36224db
#或
git rebase -i HEAD~3
我们会看到
上面未被注释的部分列出的是我们本次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)
于是:
接着进入消息修改界面
编辑完保存即可完成commit的合并了:
- 将某一段commit粘贴到另一个分支上
当我们项目中存在多个分支,有时候我们需要将某一个分支中的一段提交同时应用到其他分支中,就像下图:
我们希望将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提交,我们将区间起始点向后退了一步。
运行完成后查看当前分支的日志:
可以看到,C~E部分的提交内容已经复制到了G的后面了,分支状态可以看见当前head处理游离态:
实际上,此时所有分支的状态应该是这样:
虽然此时HEAD所指向的内容正是我们所需要的,但是master分支是没有任何变化的,git只是将C~E部分的提交内容复制一份粘贴到了master所指向的提交后面,我们需要做的就是将master所指向的提交id设置为当前HEAD所指向的提交id就可以了,即:
git checkout master
git reset --hard 0c72e64