Git进阶

Git进阶

git进阶命令

文章目录

  • Git进阶
    • git branch
    • git blame
    • git stash
    • git cherry-pick
    • git log
    • fetch、pull
    • merge、rebase
    • git diff
    • git reset
    • git revert 用法

git branch

查看本地有什么分支,当前使用分支前会有一个 * 来标识
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

git blame命令

追溯一个指定文件的历史修改记录,使用 -L 指定文件的行数范围
git blame [filename]
git blame -L n1,n2 [filename]

git stash

临时性保存修改,当此时所做的修改,尚未完成又不想提交未完成的代码,但是需要切换到其他分支时使用。

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的使用教程

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

显示当前分支从哪个分支拉出来的
# git log --graph --decorate --oneline --all 

fetch、pull

git fetch, git pull, git pull -rebase区别

git fetchgit pull都是拉取代码到本地,

git fetch只拉取到本地

git pull不仅拉取到本地,还merge到本地分支中。是fetch和merge的集合体

merge、rebase

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命令详解

git diff
比较工作目录(working tree)和暂存区(index)快照之间的差异,也就是修改后还没有暂存起来的变化内容。
即查看尚未暂存的文件更新了那些部分。

git diff HEAD
显示工作版本和HEAD的差别

git diff [BranchName]
查看当前目录和另一个分支的差别

git diff HEAD^ HEAD
比较上次提交和上上次提交的差异

git diff SHA1 SHA2
比较版本1和版本2两个历史版本之间的差异

git reset

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 用法

git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交

git revert HEAD                  撤销前一次 commit
git revert HEAD^               撤销前前一次 commit
git revert commit 			撤销指定的版本
撤销也会作为一次提交进行保存。

git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,
版本会递增,不影响之前提交的内容

git revert 和 git reset的区别 :

  1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
  2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
  3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

你可能感兴趣的:(git)