git进阶命令
查看本地有什么分支,当前使用分支前会有一个 * 来标识
git branch * master
查看所有,包括隐藏分支
git branch -a
切换分支,但是不能在此工作
git checkout origin/[BranchName]
若想到分支进行工作,需要创建一个本地分支
git checkout -b [BranchName] origin/[BranchName]
跟踪远程分支(与远程库相关联的其他电脑上的分支)
git remote add [远程分支名] git://......
GIT代码管理: git remote add
删除本地分支
git branch -D [BranchName]
删除远程分支
git push origin :[BranchName]
git blame命令
追溯一个指定文件的历史修改记录,使用 -L 指定文件的行数范围
git blame [filename]
git blame -L n1,n2 [filename]
临时性保存修改,当此时所做的修改,尚未完成又不想提交未完成的代码,但是需要切换到其他分支时使用。
Stash会接收工作目录当前状态,并将其保存到未完成的修改栈中。
暂存当前的改动
git stash
给这个stash一个叫简介
git stash save "Message"
暂存改动列表
git stash list
恢复暂存的所有改动
git stash apply
回复暂存的某个改动,num为通过git stash list
git stash apply stash@{num}
将git stash栈中最后一个版本取出来恢复
git stash pop
删除一个stash提交
git stash clear
将远程仓库的一个特定提交合并到自己的分支中
git cherry-pick的使用
git cherry-pick的使用教程
git cherry-pick [commitId]
方法:
git checkout [修改信息所在的分支]
git log 找到想要复制的commitId
切换到自己分支使用
git cherry-pick [commitId]
复制多个
git cherry-pick [commitId] [commitId]
复制提交id为commitId1到commitId10两次提交之间的所有内容
git cherry-pick [commitId1]..[commitId10]
复制 `包括` 提交id为A到B两次提交之间的所有内容
git cherry-pick A^..B
git cherry-pick的使用教程
配置项:
-e,--edit
打开外部编辑器,编辑提交信息
-n,--no-commit
只更新工作区和暂存区,不产生新的提交
-x
在提交信息的末尾一行追加:cherry picked from commit..,方便以后查找
-s,--signoff
在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作
-m parent-number,--main parent-number
如果原始提交是一个合并节点,来自于两个分支的合并,那么 Cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动。
-m配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号。
Cherry pick 采用提交commitHash来自编号1的父分支的变动。 $ git cherry-pick -m 1 <commitHash>
一般来说,1号父分支是接受变动的分支(the branch being merged into),2号父分支是作为变动来源的分支(the branch being merged from)。
代码冲突:
若发生冲突,cherry pick 会停下,让用户决定如何继续操作
--continue
解决完冲突后,首先将修改的文件重新加入暂存区(git add .)
之后使用
git cherry-pick --continue
让cherry-pick继续
--abort
发生冲突时,放弃合并,回到操作前
--quit
发生代码冲突后,退出Cherry pick 但不回到操作前
cherry-pick另一个代码库:
1、将另一个库添加为远程库
git remote add target git://....
2、拉取代码到本地(与pull不同,不merge)
git fetch target
3、根据log找到要的提交,记下commitHash
git log target/master
4、cherry-pick
git cherry-pick [commitHash]
显示当前分支从哪个分支拉出来的
# git log --graph --decorate --oneline --all
git fetch, git pull, git pull -rebase区别
git fetch
和 git pull
都是拉取代码到本地,
git fetch
只拉取到本地
git pull
不仅拉取到本地,还merge到本地分支中。是fetch和merge的集合体
rebase
git rebase简介(基本篇)
merge
将两条支线合并为一条线,合并点向后是一条线,之前是两条线。
rebase
将第二条线接在第一条线上,合并点前后一条线。 让分支历史看起来像没有经过任何合并一样
git checkout [A] A:(要合并并消除的分支)
git rebase [B] B:目标分支(合并到此分支)
这些命令会把你的"A"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"A"分支更新 为最新的"B"分支,最后把保存的这些补丁应用到"A"分支上。
更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc) 。
解决冲突:
1、解决冲突
2、git add 将修改文件加入暂存区
3、git rebase --continue
git会继续应用(apply)剩下的补丁
git rebase --abort
终止rebase的操作,并且会回到rebase开始前的状态。
git diff命令详解
git diff
比较工作目录(working tree)和暂存区(index)快照之间的差异,也就是修改后还没有暂存起来的变化内容。
即查看尚未暂存的文件更新了那些部分。
git diff HEAD
显示工作版本和HEAD的差别
git diff [BranchName]
查看当前目录和另一个分支的差别
git diff HEAD^ HEAD
比较上次提交和上上次提交的差异
git diff SHA1 SHA2
比较版本1和版本2两个历史版本之间的差异
git reset 三种模式
HEAD 表示当前版本仓库的指向
^ #表示上一个版本
git reset --hard HEAD^ #从当前版本回退到上一个版本
~[数字] #以当前版本为基数,回滚多少次
git reset --hard HEAD~3 #回滚master前三个版本
git reset --hard commit_id #使用commit_id跳到响应版本,id可以简写,git会去搜索
git reset –-soft 不会改变stage区,仅仅将commit回退到了指定的提交
git reset –-mixed 不回改变工作区,但是会用指定的commit覆盖stage 区,之前所有暂存的内容都变为为暂存的状态
git reset –-hard 使用指定的commit的内容覆盖stage区和工作区。
注:Windows下使用HEAD^
,提示More?
,是因为Windows下^
为换行符,询问你下一行是否需要再输入。
git reset --hard HEAD^后显示more?的解决方案
#此处例子使用soft回退,实际使用请自选。
加引号:
git reset --soft "HEAD^"
加一个^:
git reset --soft HEAD^^
换成~:
git reset --soft HEAD~ 或者 git reset --hard HEAD~1
~ 后面的数字表示回退几次提交,默认是一次
还可以使用git log 查看提交日志,记下commitID,使用
git reset --soft commitID
内容引自:git revert 用法
git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交
git revert HEAD 撤销前一次 commit
git revert HEAD^ 撤销前前一次 commit
git revert commit 撤销指定的版本
撤销也会作为一次提交进行保存。
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,
版本会递增,不影响之前提交的内容
git revert 和 git reset的区别 :