git 进阶

一.明确几个概念

  • 工作区 [修改了但未add]
  • 暂存区 [修改并且add了]
  • 本次分支仓库 [commit]
  • 远程分支仓库 [push]

工作区 -->git add file -->暂存区 -->git commit -m "xxx" -->本地分支-->git push origin master-->远程分支

  • Git跟踪并管理的是修改,而非文件

二.流程&规范

Git 使用规范流程
Git分支管理策略
Git flow工作流程

三. 文件操作

checkout reset

① 修改后 未add(添加到暂存区) 需要撤销修改时:
git checkout -- myfile.txt 或 手动删除工作区修改
工作区 : clean 暂存区: clean
② 修改后 add了(未commit) 再次修改文件 要撤销第二次修改时:
git checkout -- myfile.txt (将暂存区恢复到工作区)
暂存区有第一次的修改需要commit
③ 修改后 add了(未commit),需要撤销修改时:
git reset HEAD myfile.txt (将暂存区修改删除)
此时工作区的修改还未撤销
git checkout -- myfile.txt (撤销工作区修改)
④ 修改后 add并commit了,需要撤销修改时:
git reset --hard HEAD^ (版本回退)**
注意:
git reset --hard会回退到你最近提交的版本上,如果你修改了工作区的内容只add了没有commit 那么使用了这个命令之后会回退到你最近一次commit的那个版本,你在工作区的修改就会丢失掉

删除文件 以及 恢复删除的文件。 git rm file ;

四. 分支操作

(1) 拉取分支:
git clone xxx;git自动把本地master和远程master分支对应起来,并且远程仓库的名字默认为origin。可以通过git remote 或者git remote -v 来查看。
(2) 推送分支:
git push origin xxx;把本地xxx分支推送到远程服务器。如果远程存在xxx分支,就是同步内容;如果远程没有xxx分支,就是把本地分支push到远程,并且建立关联。
(3) 更新本地分支
git pull

(4) 删除分支
4.1 删除本地分支 在新分支开发功能完毕,如果功能需要,则merge到相应的分支,然后新分支可以通过 git branch -d new_branch 删除。
如果功能开发后,不需要了,即没有merge到其他分支,还用上面的删除命令就会报new_branch分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令git branch -D new_branch。即用大写的D强行删除

4.2 删除远程分支

   git push origin :分支名
   git push origin :<remote-branch> 或者 git push origin --delete <remote-branch>

4.3 清除已被远程分支删除的本地残余 git remote prune origin

(5)与主干同步
分支的开发过程中,要经常与主干同步
git fetch origin
git rebase origin/master

五. 别名提高效率

  • git config --global alias.st status

  • git config --global alias.co checkout

  • git config --global alias.ci commit

  • git config --global alias.br branch

  • git config --global alias.unstage 'reset HEAD'

  • git config --global alias.last 'log -1'

  • git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

  • git config --global alias.ref 'remote prune origin'

  • git config --global alias.xxx xxxxxxx或者 git config --global alias.xxx 'xxxxxxxxxx'

六. 用好下面几个命令

6.1. rebase

rebase 是一个很清爽的命令
$ git rebase <[origin/]branch>
rebase 用于重整分支到参数branch的下游,使gitflow看着十分清爽
进阶:git rebase -i 可以重排 commit 历史
缺点:
rebase 解决冲突较为繁琐
警告:
rebase 时请认准上游
只能用 rebase 重整本地提交

另外:git rebase 还可以把多次提交合并为一个[确保没有冲突]
git rebase -i HEAD~[number_of_commits]

6.2. merge

merge 进阶:
 --squash 可以把 commits 合而为一
 --no-ff 可以禁止 fast-forward 从而产生 merge info

git merge --squash的使用场景&使用方法
feature分支修改提交了多次即多个commit,dev分支 merge feature分支时候,如果feature分支的commit messages是有意义的就保留多次commit信息,否则就使用
--squash进行合并,然后添加新的message进行提交


git merge --no-ff的使用场景&使用方法
feature分支修改提交了多次,即多个commit,dev分支 merge feature分支时,fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建commit

问:什么时候用git rebase ,又是什么时候用git merge?
同一分支:git pull --rebase
不同分支:如果没有push到远程分支过,git rebase 上游branch.否则 git merge 上游分支。

6.3. stash

用于bug分支,当有临时事情需要处理,而手上需求分支尚未完成。可以通过stash,把当前修改的内容藏匿起来。在有bug的分支 checkout一个bug分支,处理完成之后,在回到需求分支,通过stash pop 把藏匿的内容恢复,继续工作
git stash
git stash list
git stash apply
git stash apply@{0}
git stash drop
git stash pop

注意:如果在git stash 后,不小心git stash pop 或者git stash drop ,也就是说stash的内容被丢弃了,但这些内容有有用,是否有办法恢复stash pop/drop的内容呐?

(1) 如果命令窗口尚未关闭,可以找到对应的stash pop/drop的stash_hash。然后通过 git stash apply stash_hash恢复。参考[How to recover a dropped stash in Git?](http://stackoverflow.com/questions/89332/how-to-recover-a-dropped-stash-in-git/7844566#7844566)
(2) 如果执行stash pop/drop 的窗口关闭了,通过 git fsck --no-reflog | awk '/dangling commit/ {print $3}' 或者 gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) 找到响应的stash_hash ,然后git stash apply stash_hash
参考[How to recover a dropped stash in Git?](7bf8709bb275632b584b994f8a32a91219501f19)
另外:
如果不确定就用 git stash apply。
如果本分支stash了内容,基于本分支 checkout -b 一个新分支也带有stash信息,并且这份stash信息是同一份,如果在新分支stash pop/drop了,之前的分支同样也不见了。

6.4.cherry-pick

如果不想一次合并整个分支,那么…  cherry-pick 可以选择合并部分 commit
 在本地 master 分支上做了一个commit ( 38361a68138140827b31b72f8bbfd88b3705d77a ) , 如何把它放到 本地 old_cc 分支上?

办法之一: 使用 cherry-pick.  根据git 文档:
Apply the changes introduced by some existing commits
就是对已经存在的commit 进行apply (可以理解为再次提交)
简单用法:
git cherry-pick <commit id>
如果顺利,就会正常提交
如果在cherry-pick 的过程中出现了冲突,就跟普通的冲突一样,手工解决,然后根据提示continue
通过git status查看状态

6.5. reflog

你提交了一个你不想要提交的代码,最后你通过使用硬重置(hard reset)使其回到了之前的状态。稍后,你意识到,在这个过程中你丢失了一些其他的信息,并想要退回或是至少能看一眼。git reflog命令可以帮你做到这一点。

一个简单的git log命令,显示你最近的提交信息,以及上一次,再上一次的提交信息,以此类推。

而git reflog显示的是所有head移动的信息。记住,它是在本地的,而不是你仓库的一部分,不会包含在推送(push)和合并中(merge)

6.6. show

git fsck --lost-found
这里你可以看到丢失的提交,你可以使用git show [commit_hash]来查看这些提交所包含的改动或者是使用git merge [commit_hash]来恢复它。
git fsck比reglog有一个优势。比如你删除了一个远端分支并且克隆了仓库,使用fsck命令你可以搜索并恢复该远端分支

6.7. tag

tag是什么

tag就是标签,git也有在历史状态的关键点“贴标签”的功能--一般人们用这个功能来标记发布点

如何打tag

git tag <name> 用于创建一个标签,默认为HEAD,也可以指定commitid
git tag -a <tagname> -m "taginfo" ;可以指定标签信息
git tag 查看所有标签
git push origin <tagname>可以推送一个本地标签
git push origin --tags可以推送全部未推送过的本地标签
git tag -d <tagname>可以删除一个本地标签
git push origin :refs/tags/<tagname>可以删除一个远程标签

如何使用tag

先 git clone 整个仓库,然后 git checkout tag_name 就可以取得 tag 对应的代码了。

但是这时候 git 可能会提示你当前处于一个 detached HEAD 状态,因为 tag 相当于是一个快照,是不能更改它的代码的,如果要在 tag 代码的基础上做修改,你需要一个分支:git checkout -b branch_name tag_name

6.8. revert回滚一个分支的合并

七. 和ide的结合

sourcetree
smartgit
androidstudio

八. 解决冲突

8.1 产生冲突的原因

git pull 或者 git merge 或者 git rebase 或者 git stash pop的时候可能冲突
git 亦使用 <<<< ==== >>>> 格式的标示

8.2 如何解决冲突

git st git diff
结合ide使用比如android开发,结合androidstudio效率更高

九. 参考

  1. 廖雪峰git教程
  2. 《Git Community Book 中文版》
  3. 《Pro Git 中文版》
  4. Getting Started Git Flow
  5. 让你的Git水平更上一层楼的10个小贴士
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,449评论 1 26
  • 2017年9月27日 晴转多 星期三(28) 今天中午孩子午休起来的时候一直在吵闹,因为我在楼下忙接货清点货,他在...
    大野芳菲阅读 175评论 0 4
  • 昨晚我的爱豆因为拍戏劳累过度高血压晕倒住院了,很是震惊。我的情绪是经历了这么几个过程的,担心-气愤-难过。 ...
    real李柚熙阅读 394评论 0 0
  • 生活就是这样子 你特么好歹轻松一点儿 马上就有事儿来给你添乱了 相信我 一定是很多糟心事儿一起来 跟商量...
    翮笙阅读 267评论 0 0