操作命令记录

cherry-pick

cherry-pick,就是下面ruby_client不想要整个分支,只想要e43a6,那就樱桃挑选e43a6就可以。

Paste_Image.png

Paste_Image.png

关于Branch

  1. Creating a New Branch,
    只是创建啦testing branch,并不切换到testing
$ git branch testing
  1. 查看branch历史
    会显示所有它的commit,还会显示哪个branch指向哪个commit,还有HEAD当前指向哪个branch。
$ git log --oneline --decorate

这个命令显示branch历史是图形样式的。

$ git log --oneline --decorate --graph --all
  1. 切换branch
    working tree里面文件都变成testing所指向那个commit指向的那个snapshot的样子。
    HEAD文件也从原来的branch变成指向testing branch
$ git checkout testing
  1. 新建并切换branch
    该命令新建一个iss53 branch,并且切换到该branch
$ git checkout -b iss53
//上面一句相当于下面两句命令。
$ git branch iss53
$ git checkout iss53
  1. 删除分支
    删除名为hotfix的分支。
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
  1. 列出所有的branch
    带有*的是现在checkout的branch
$ git branch
  iss53
 * master
  testing

显示各个branch最后一次commit信息

git branch -v
  iss53     93b412c fix javascript issue
 * master  7a98805 Merge branch 'iss53'
  testing   782fd34 add scott to the author list in the readmes

--merged--no-merged两个参数可以过滤branch

//显示已经merge到当前分支(master)的branch,过滤其他的
$ git branch --merged 
  iss53
 * master
//显示没有merge到当前分支的branch
$ git branch --no-merged 
  testing
//因为testing branch没有merge到当前分支,所以不能直接删除
$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

关于remote branch

  • remote branch是不能移动的,它会自动根据服务器的branch进行移动。
  1. 查看remote branch的信息
git ls-remote [remote]
git remote show [remote]
  1. 克隆远程仓库
git clone //默认存储到origin/master,就是远程服务默认名为origin
git clone -o booyah  //该命令,使得仓库存储到booyah/master
  1. 从远程仓库获取更新
    • 从服务器获取本地没有的分支。
      如果服务器有个新的分支叫serverfix,本地没有
      git fetch origin会获取更新,但我们不会有一个新的本地的serverfix分支,只有一个origin/serverfix远程分支,而且还是不能修改的。
git fetch origin

origin/serverfix远程分支合并当前所在的本地分支上

git merge origin/serverfix

也可以新建一个本地分支(serverfix),checkout这个origin/serverfix远程分支

$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

下面三个命令做的是同样的事情。

// 正常命令,从origin/serverfix获取并创建本地的serverfix分支。
$ git checkout -b serverfix origin/serverfix
// 上面操作太常用,所以git提供啦更简单的命令
$ git checkout --track origin/serverfix
/* 
下面这个命令,更加简单,当本地不存在“serverfix”分支,
且远程服务中,有且只有一个与“serverfix”名字匹配的分支“
git就会自动创建本地分支。
*/
$ git checkout serverfix
  - 设置本地分支的上游分支(就是本地对应远程分支)
//-u 参数代表(upstrem branch)的缩写
$ git branch -u origin/serverfix
  - 从服务器获取remote branch的更新,并合并到当前分支

假设,当前在master分支上,且master分支的(upstream branch)是 origin/master

$ git fetch origin
$ git fetch --all  //这个命令代替上一个,就会把所有远程分支都更新。
//--------------------------------------------------
$ git merge origin/master
//下面两句命令用@{u}和@{upstream}代替origin/master,比较方便
$ git merge @{u}
$ git merge @{upstream}
  - git pull
$ git pull 
//git pull == git fetch + git merge 一个命令其实就是两个的结合
$ git fetch 
$ git merge
  - 删除远程服务器无用的branch
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
 -[deleted]         serverfix
  1. 添加新的远程服务
git remote add teamone https://sss.github.com/sss/ss
  1. 推送更新到远程服务
    • 将远程没有的本地分支,推送到远程服务器与别人共享
$ git push <remote> <branch>
$ git push origin serverfix

这里git会自动把serverfix扩展成
refs/heads/serverfix:refs/heads/serverfix,就是说把我本地的serverfix更新到远程的serverfix分支中。

git push origin serverfix:serverfix  //这种写法也可以
git push origin serverfix:awesomebranch 
//推送到远程分支时,分支名叫awesomebranch
  1. 查看本地branch与远程branch的关系
    输出结果解释:
    • iss53分支:追踪origin/iss53,ahead 2表示本地有两个commit未推送到远程
    • master分支:追踪origin/master,是与远程分支一致的最新版本
    • serverfix分支:追踪teamone/server-fix-good,远程分支有一个commit为下载并merge到本地,本地有三个commit未推送到远程。
    • testing分支:是完全本地的分支,不追踪任何远程分支。
$ git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] forgot the brackets
  master    1ae2a45 [origin/master] deploying index fix
*serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
  testing   5ea463a trying something new

关于staging area

  1. 添加文件到staging area
$ git add README test.rb LICENSE
  1. 查看staging area的状态
git status

关于commit

  1. 提交,直接输入信息
$ git commit -m 'The initial commit of my project'
  1. 提交,打开编辑器输入信息
$ git commit 
  1. -a 选项,告诉git提交前,自动将修改回删除的文件添加到staging area。
    但是新增加的,git还没有track的文件不会添加进去。
$ git commit -a -m 'made a change'

关于git diff

  1. 检查有没有whitespace issues(不知道这是什么,先记下来吧)
    在commit之前执行该命令。
git diff --check

关于merge

  1. 将一个branch合并到另一个
    假设目前在hotfix上修复问题,问题修复完成要合并到主分支
    先切换到主分支master,然后git merge hotfix
$ git checkout master
$ git merge hotfix
  1. merge的两种状况
  • Fast-forward
    如图一所示,hotfix对master中的紧急问题进行啦修复
    修复完毕后,要把hotfix合并到master中,那么这种情况下,git merge命令直接就把masterbranch移动到hotfix所在commit(就是c4)
    命令执行时会显示,是Fast-forward,因为这种情况的合并是简单的移动啦master分支。合并后如图二所示。
    并且此时hotfix分支没什么鸟用啦,可以删除掉。
    图一

    图二
  • Merge made by the 'recursive' strategy.
    第二种状况,要合并的两个分支已经不再同一条线上,从C2开始分裂成两条线啦。如图三所示。
    如下的合并命令虽然跟之前的一样,但结果发生的事情不一样啦。
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html |    1 +
1 file changed, 1 insertion(+)

这种合并,会基于图四所示的三个Commit(C2、C4、C5),两个是分支所指向的commit,一个是那两个commit的共同祖先。
最终生成一个新的commit obejct,如图五所示的C6。(Fast-forward类型的merge不产生新的commit)
C6叫做Merge commit,它有两个parent(C4和C5),这就是Merge commit特殊的地方。
合并完毕后,如果iss53没用啦,可以删除掉。


图三

图四

图五

Merge冲突的处理过程

下面merge命令执行后,显示有冲突

$ git merge iss53 

冲突后,Git就暂停啦merge commit的创建,可以用下面命令看是哪些文件冲突。

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

有冲突的文件在Unmerged paths条目下列出。
结果中提示啦,用git add命令来标记冲突文件问题已经解决。
下面是冲突文件中的冲突内容的样子,上下两个分支名(HEAD、iss53),(=======)上面属于HEAD,(=======)下面属于iss53。

<<<<<<< HEAD:index.html
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

如果想用可视化工具来解决冲突,用下面的命令就行。
运行命令后输出的文字中,提示啦可以使用的mergetools,在命令行中输入想要用的工具,比如说输入:kdiff3,git就会打开那个工具来进行冲突修改。
如果有多个冲突文件,如下面Merging列出啦:LICENSE和README,会依次打开两个冲突进行修改。

$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc codecompare emerge vimdiff
Merging:
LICENSE
README

当然也可以直接用vim来修改冲突文件。

vim README 

冲突修改完毕后,使用git mergetool命令,会自动将冲突文件add到staging area,而vim README命令需要手动用git add来将文件添加。
最后,提交就好啦。

git commit

关于rebase

  1. 最简单的rebase
    仓库的状态如图一所示:
    1.下载master分支时,只有C2,基于C2新建分支(experiment)分支,进行修改
    2.然后别人对仓库进行啦push,master更新到C3
    4.我们可以使用rebase操作将experiment的修改应用到C3


    图一:初始的仓库状态
$ git checkout experiment
$ git rebase master

两行命令作啦啥?
1.对比experiment分支所有commit相对于两个分支的共同祖先(C2)的内容区别,将这些区别存储到临时文件中。
2.把当前分支(experiment)重新设定到rebase指定的分支(master)的commit(也就是C3)上,然后将临时文件中存储的内容区别应用到C3上,产生C4'
3.最后experiment分支设定到C4'上。
4.其实rebase相对于merge的好处是,减少历史信息,如图二,在rebase操作后, 就变成啦一条线,C4就消失啦(不过其实C4的对象仍然有存着的,过一段时间运行GC才会删除)

图二:rebase结果

$ git checkout master
$ git merge experiment

最后就是合并啦,这次Merge属于Fast-forward,Master直接往前移动一下就好啦。


图三:合并
  1. 更有趣一点的rebase


    图四:
$ git rebase --onto master server client

将C8和C9的修改直接应用到master分支上。
结果如图五所示,注意C3的内容不会被应用到master上,只有C8和C9的修改会。


图五:跨越分支rebase
$ git checkout master
$ git merge client

将client合并进master分支,fast-foward


图六:rebase后merge
git rebase [basebranch] [topicbranch]
$ git rebase master server

server分支在master上rebase


$ git checkout master
$ git merge server
$ git branch -d client
$ git branch -d server
把server合并到master后
  1. rebase会引发的问题与解决办法
    我们进行啦开发,产生C2 和 C3
    初始状态:服务器有master分支,指向C1,本地clone后基于C1进行开发

    我们进行啦Fetch,得到C4、C5、C6,进行merge得到C7
    然后别人push到服务器带有merge历史的操作,我们fetch下来进行merge

    别人强制覆盖啦服务器的merge,改为rebase,产生C4',然后我们fetch下来
    提交merge的那人在自己电脑上重新rebase,覆盖掉啦merge,同时强制推送到服务器,我们又fetch啦

    我们用啦git pull,把C7与C4'合并得到C8,但是C4和C4'修改的内容是重复的
    我们git pull合并啦C4'和C7

    解决办法是
git pull --rebase  //代替 git pull
//或者用
git fetch
git rebase teamone/master

得到结果,所以说某些情况下发生这种事情,确保团队别的成员都用git pull --rebase,并且使用rebase的原则是never rebase anything you’ve pushed somewhere.


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

推荐阅读更多精彩内容

  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,369评论 1 26
  • 本片内容转自CSDN http://blog.csdn.net/ithomer/article/details/7...
    五娃儿阅读 4,824评论 2 88
  • 恭喜安迪,终于脱单!没有丝毫意外,男朋友就是又骚又贱又体贴的小包总。 安迪是这么向22楼姐妹们介绍小包总的: 是不...
    文琪来啦阅读 217评论 0 0
  • 我的故乡外面是黄河,黄河围起了我的故乡。夏天河水蒸腾着冲散暑气,冬天河水筑起冰壳沉寂了寒冷。河水给了这座小城一个名...
    红烧茄子黄焖鸡阅读 194评论 0 0
  • 在一个失眠的夜晚,夜深总是能让人感性起来,我和师父道了晚安,却翻来覆去想事情。 从来没有想过情缘的我,突然就想要情...
    玉泠泠阅读 197评论 0 0