Git

Git 簡介

Git是目前世界上最先進的分布式版本控制系統(tǒng),沒有之一。


勤用 git status 查看狀態(tài)和提示,準沒錯的。

廖雪峰 Git 教程


集中式 VS 分布式

CVS及SVN都是集中式的版本控制系統(tǒng)举畸,而Git是分布式版本控制系統(tǒng),集中式和分布式版本控制系統(tǒng)有什么區(qū)別呢凳枝?

先說集中式版本控制系統(tǒng)抄沮,版本庫是集中存放在中央服務器的,而干活的時候岖瑰,用的都是自己的電腦叛买,所以要先從中央服務器取得最新的版本,然后開始干活蹋订,干完活了率挣,再把自己的活推送給中央服務器。中央服務器就好比是一個圖書館露戒,你要改一本書椒功,必須先從圖書館借出來,然后回到家自己改智什,改完了动漾,再放回圖書館。

集中式版本控制系統(tǒng)

集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作荠锭,如果在局域網(wǎng)內(nèi)還好旱眯,帶寬夠大彭沼,速度夠快链沼,可如果在互聯(lián)網(wǎng)上陶贼,遇到網(wǎng)速慢的話蔫敲,可能提交一個10M的文件就需要5分鐘,這還不得把人給憋死啊痘拆。

那分布式版本控制系統(tǒng)與集中式版本控制系統(tǒng)有何不同呢赏表?首先蔼两,分布式版本控制系統(tǒng)根本沒有“中央服務器”叫搁,每個人的電腦上都是一個完整的版本庫,這樣供炎,你工作的時候渴逻,就不需要聯(lián)網(wǎng)了,因為版本庫就在你自己的電腦上音诫。既然每個人電腦上都有一個完整的版本庫惨奕,那多個人如何協(xié)作呢?比方說你在自己電腦上改了文件A竭钝,你的同事也在他的電腦上改了文件A梨撞,這時雹洗,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了卧波。

說明

首先這里再明確一下时肿,所有的版本控制系統(tǒng),其實只能跟蹤文本文件的改動港粱,比如TXT文件螃成,網(wǎng)頁,所有的程序代碼等等查坪,Git也不例外寸宏。版本控制系統(tǒng)可以告訴你每次的改動,比如在第5行加了一個單詞“Linux”偿曙,在第8行刪了一個單詞“Windows”氮凝。而圖片、視頻這些二進制文件望忆,雖然也能由版本控制系統(tǒng)管理罩阵,但沒法跟蹤文件的變化,只能把二進制文件每次改動串起來炭臭,也就是只知道圖片從100KB改成了120KB永脓,但到底改了啥,版本控制系統(tǒng)不知道鞋仍,也沒法知道常摧。

不幸的是,Microsoft的Word格式是二進制格式威创,因此落午,版本控制系統(tǒng)是沒法跟蹤Word文件的改動的,前面我們舉的例子只是為了演示肚豺,如果要真正使用版本控制系統(tǒng)溃斋,就要以純文本方式編寫文件。

因為文本是有編碼的吸申,比如中文有常用的GBK編碼梗劫,日文有Shift_JIS編碼,如果沒有歷史遺留問題截碴,強烈建議使用標準的UTF-8編碼梳侨,所有語言使用同一種編碼,既沒有沖突日丹,又被所有平臺所支持走哺。

使用Windows的童鞋要特別注意:
千萬不要使用Windows自帶的記事本編輯任何文本文件。原因是Microsoft開發(fā)記事本的團隊使用了一個非常弱智的行為來保存UTF-8編碼的文件哲虾,他們自作聰明地在每個文件開頭添加了0xefbbbf(十六進制)的字符丙躏,你會遇到很多不可思議的問題择示,比如,網(wǎng)頁第一行可能會顯示一個“?”晒旅,明明正確的程序一編譯就報語法錯誤栅盲,等等,都是由記事本的弱智行為帶來的敢朱。建議你下載 Notepad++ 代替記事本剪菱,不但功能強大,而且免費拴签!記得把Notepad++的默認編碼設置為UTF-8 without BOM 即可:


Unix的哲學是——沒有消息就是好消息孝常。

廢話說完了,下面開始命令

  • git init:將一個目錄或文件夾初始化成 Git 可以管理的倉庫( repository )
  • git add readme.txt:把 readme.txt 文件的修改添加到暫存區(qū)蚓哩;
  • git add .:將當前目錄下所有文件添加到暫存區(qū)构灸;
  • git commit -m 'the commit info':將暫存區(qū)中的修改提交倉庫
  • git status:查看倉庫當前狀態(tài)岸梨;
  • git diff readme.txt:查看文件具體不同喜颁;
  • git log [--pretty=oneline]:查看提交歷史
  • git reset --hard HEAD^:回到上一個版本曹阔;
  • git reset --hard HEAD~n:回到上 n 個版本半开;
  • git reset --hard commit_id:回到commit_id對應的版本;
  • git reflog:查看命令歷史——包括每一次的commit_idT叻荨寂拆!這樣就可以任意穿越!抓韩!
  • git checkout -- readme.txt將 工作區(qū)中的修改 恢復到最近一次addcommit的狀態(tài)纠永,即若add后又作了修改,就恢復到add時的狀態(tài)谒拴;若commit后作了修改尝江,就恢復到commit時的狀態(tài);(注意這里--是單獨在中間的英上,沒有和readme.txt連起來L啃颉)
  • git reset HEAD readme.txt將 暫存區(qū)中readme.txt的修改 撤銷(unstage)掉,重新放回工作區(qū)苍日;
  • git rm a.txt:刪除a.txt并將修改添加到暫存區(qū)惭聂;
  • git remote add origin https://github.com/xiaogmail/learnit.git 將本地倉庫與遠程倉庫關聯(lián)起來;
  • git push -u origin master:將本地倉庫推送到遠程倉庫易遣;
    • 由于遠程庫是空的,我們第一次推送 master 分支時嫌佑,加上了-u 參數(shù)豆茫,Git不但會把本地的 master 分支內(nèi)容推送的遠程新的 master 分支侨歉,還會把本地的 master 分支和遠程的 master 分支關聯(lián)起來,在以后的推送或者拉取時就可以簡化命令揩魂,git push搞定幽邓。

  • git branch:查看分支;
  • git branch <name>:創(chuàng)建分支火脉;
  • git checkout <name>:切換分支牵舵;
  • git checkout -b <name>:創(chuàng)建并切換分支;
  • git branch -d <name>:刪除分支倦挂;
  • git merge <name>:合并某個分支到當前分支畸颅;
  • git merge --abort:終止合并(在遇到?jīng)_突要你手動合并時);
  • git log --graph --pretty=oneline --abbrev-commit:查看分支圖方援;
  • git merge --no-ff dev -m 'master merge dev with --no-ff'強制非快進模式没炒,這才是正確使用方式。不要默認的 Fast-forward犯戏。
  • git stash:保存和隱藏當前工作現(xiàn)場送火;
  • git stash list:查看隱藏的工作現(xiàn)場;
  • git stash apply:恢復工作現(xiàn)場先匪;
  • git stash drop:刪除隱藏的工作現(xiàn)場种吸;
  • git stash pop:恢復并刪除;
  • git remote:查看遠程倉庫信息呀非;
  • git remote -v:查看更詳細的信息(url 地址)坚俗;
  • git push origin branch-name:從本地推送分支;
  • git checkout -b branch-name origin/branch-name在本地創(chuàng)建和遠程分支對應的分支姜钳;
  • git branch --set-upstream-to=origin/branch-name:建立本地分支和遠程分支的關聯(lián)坦冠;
  • git pull:從遠程分支抓取。如果有沖突哥桥,先解決沖突辙浑;
  • git tag <tagname>:在當前最新提交上創(chuàng)建一個標簽;
  • git tag <tagname> <commit id>:在指定 commit id 上創(chuàng)建標簽拟糕;
  • git tag -a <tagname> -m <'tag information'>:帶提示信息的標簽判呕;
  • git tag:查看所有已建立的標簽;
  • git show <tagname>:查看某個標簽的詳細信息(如建在哪個 commit id 上)送滞;
  • git tag -d <tagname>:刪除標簽(本地)侠草;
  • git push origin <tagname>:推送標簽到遠程倉庫;對犁嗅,標簽也要推送边涕!
  • git push origin --tags:一次性推送所有未推送標簽;
  • git push origin :refs/tags/<tagname>:刪除一個遠程標簽(首先要在本地刪除);


手動新建一個 readme.txt 并寫入內(nèi)容 aaaaa后功蜓,用git status查看狀態(tài):

Untracted files

執(zhí)行git add readme.txt后再次查看狀態(tài):

add 修改后再次查看 status

readme.txt中添加一行bbbbb并保存后园爷,查看狀態(tài):

Changes to be commited:暫存區(qū)中有未提交的修改;
Changes not staged for commitnot staged式撼,未將修改添加到暫存區(qū)童社;

再添加一行ccccc后,用git diff readme.txt查看區(qū)別:

git diff readme.txt

像這樣著隆,你不斷對文件進行修改扰楼,然后不斷提交修改到版本庫里,就好比玩RPG游戲時美浦,每通過一關就會自動把游戲狀態(tài)存盤弦赖,如果某一關沒過去,你還可以選擇讀取前一關的狀態(tài)抵代。有些時候腾节,在打Boss之前,你會手動存盤荤牍,以便萬一打Boss失敗了案腺,可以從最近的地方重新開始。Git也是一樣康吵,每當你覺得文件修改到一定程度的時候劈榨,就可以“保存一個快照”,這個快照在Git中被稱為commit晦嵌。一旦你把文件改亂了同辣,或者誤刪了文件,還可以從最近的一個commit恢復惭载,然后繼續(xù)工作旱函,而不是把幾個月的工作成果全部丟失。

  • git log [--pretty=oneline]:查看日志描滔;
git log
git log --pretty=oneline

需要友情提示的是棒妨,你看到的一大串類似3628164...882e1e0的是commit id(版本號),和 SVN 不一樣含长,Git的commit id不是1券腔,2,3……遞增的數(shù)字拘泞,而是一個SHA1計算出來的一個非常大的數(shù)字纷纫,用十六進制表示,而且你看到的commit id和我的肯定不一樣陪腌,以你自己的為準辱魁。為什么commit id需要用這么一大串數(shù)字表示呢烟瞧?因為Git是分布式的版本控制系統(tǒng),后面我們還要研究多人在同一個版本庫里工作染簇,如果大家都用1燕刻,2,3……作為版本號剖笙,那肯定就沖突了。

時光機---回退:將工作區(qū)恢復到以前的某個版本

首先请唱,Git必須知道當前版本是哪個版本弥咪,在Git中,用HEAD表示當前版本十绑,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣)聚至,上一個版本就是HEAD^,上上一個版本就是HEAD^^本橙,當然往上100個版本寫100個^扳躬,比較容易數(shù)不過來,所以寫成HEAD~100甚亭。

HEAD

現(xiàn)在會退到上一個版本:git reset --hard HEAD^

git reset --hard HEAD^

看贷币,readme.txt果然回去了:

readme.txt
但是!如果剛才是手殘亏狰,現(xiàn)在想回到add ccccc的那個版本怎么辦役纹??

——有辦法暇唾!前提是你剛才的窗口還沒關促脉!

辦法其實還是有的,只要上面的命令行窗口還沒有被關掉策州,你就可以順著往上找啊找啊瘸味,找到那個append GPLcommit id3628164...,于是就可以指定回到未來的某個版本:
$ git reset --hard 3628164 HEAD is now at 3628164 append GPL
版本號沒必要寫全够挂,前幾位就可以了旁仿,Git會自動去找。當然也不能只寫前一兩位下硕,因為Git可能會找到多個版本號丁逝,就無法確定是哪一個了。

HEAD

現(xiàn)在梭姓,你回退到了某個版本霜幼,關掉了電腦,第二天早上就后悔了誉尖,想恢復到新版本怎么辦罪既?找不到新版本的commit id怎么辦?

在Git中,總是有后悔藥可以吃的琢感。當你用git reset --hard HEAD^回退到add distributed版本時丢间,再想恢復到append GPL,就必須找到append GPLcommit id驹针。Git提供了一個命令git reflog用來記錄你的每一次命令:

$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file

現(xiàn)在烘挫,你又可以用git reset --hard commit_id回到未來了!


工作區(qū)--暫存區(qū)--某個分支:
工作區(qū)-暫存區(qū)-某個分支
撤銷柬甥,工作區(qū)中饮六,對某個文件最近的修改——即還未stage的修改

git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區(qū)的修改全部撤銷苛蒲,這里有兩種情況:

  • 一種是readme.txt自修改后還沒有被放到暫存區(qū)卤橄,現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài)臂外;
  • 一種是readme.txt已經(jīng)添加到暫存區(qū)后窟扑,又作了修改,現(xiàn)在漏健,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)嚎货;

總之,就是讓這個文件回到最近一次git commitgit add時的狀態(tài)蔫浆。

discard changes in working directory

上面是撤銷工作區(qū)中的修改厂抖,若想撤銷暫存區(qū)中的呢?

撤銷(unstage)暫存區(qū)中克懊,未提交(commit)的修改忱辅,重新放回工作區(qū):

git reset HEAD readme.txt

git reset HEAD readme.txt

刪除文件

git rm a.txt

修改若添加到了暫存區(qū),則先要恢復暫存區(qū)(git reset HEAD a.txt)谭溉,再恢復工作區(qū)(git checkout -- a.txt)墙懂。


連接 Github

注冊賬戶之后,首先需要在 Github 上對本機添加信任(SSH, RSA)扮念,步驟损搬;
完成后在 Github 上可以看到:

SSH keys

接下來在 Github 上新建一個空的倉庫,然后把本地的倉庫與之關聯(lián)柜与,將本地倉庫內(nèi)容推送到 Github 倉庫:

  1. git remote add origin https://github.com/xiaogmail/learngit.git
  2. git push -u origin master
Quick setup an empty repository

或者巧勤,遠程倉庫已經(jīng)存在,從遠程倉庫克隆到本地:
git clone https://github.com/xiaogmail/learngit.git

創(chuàng)建與合并分支

git checkout -b dev:創(chuàng)建并切換到dev分支弄匕;

git checkout -b dev

上面相當于以下兩條命令:
git branch dev:創(chuàng)建dev分支颅悉;
git checkout dev:切換到dev分支;

git branch查看分支:

git branch

現(xiàn)在迁匠,在readme.txt中加一行new branch然后提交(到dev分支)剩瓶,再git branch master切換回master分支:

提交 dev 后回到 master 分支

這時你發(fā)現(xiàn)驹溃,readme.txt中最后一行new branch不見了!(用Notepad++需要關閉并重新打開文件)——因為回到了master分支延曙!

現(xiàn)在豌鹤,把dev分支的內(nèi)容合并到master分支上:git merge dev
這時會發(fā)現(xiàn)readme.txtnew branch的內(nèi)容又回來了;

git merge dev

注意到上面的Fast-forward信息枝缔,Git告訴我們布疙,這次合并是“快進模式”,也就是直接把master指向dev的當前提交愿卸,所以合并速度非彻樟桑快。
當然擦酌,也不是每次合并都能Fast-forward,我們后面會講其他方式的合并菠劝。

合并完成后的分支狀態(tài):

git merge dev

合并完成后赊舶,就可以放心的刪除dev分支了:git branch -d dev

因為創(chuàng)建赶诊、合并和刪除分支非沉剑快,所以 Git 鼓勵你使用分支完成某個任務舔痪,合并后再刪掉分支寓调,這和直接在 master 分支上工作效果是一樣的,但過程更安全锄码。

解決沖突

現(xiàn)在夺英,你在dev上新增一個提交,切換回master滋捶,在master上也新增一個提交痛悯,變成了這樣:

分叉了

這時你用git merge dev合并分支:

git merge dev

其中,dev 中 readme.txt 最后一行是 "dev new line"重窟,master 中是 "master new line"载萌;

這時發(fā)現(xiàn),readme.txt 的內(nèi)容變了:

git merge dev 失敗后 readme.txt的內(nèi)容變了巡扇!

Git 用 <<<<<<<扭仁,=======,>>>>>>> 標記出不同分支的內(nèi)容

注意上面最后一句話:“Automatic merge failed; fix conficts and then commit the result.”——現(xiàn)在還處于 merge 狀態(tài)厅翔,只不過需要你手動完成乖坠。

我修改為如下:

然后提交,git add readme.txt刀闷,git commit -m 'fix conflicts.'
這樣瓤帚,merge 操作才算手動完成描姚,現(xiàn)在造虎,分支圖:

分叉了
手動合并

看懂分支圖的變化:綠線表示在 master 分支上將 dev 分支的內(nèi)容合并進來洒闸,但 feature1 是不變的!它是被合并的那一個可柿!不動怯邪!

仔細想想合并的過程绊寻。同一個文件,稍微有點不一樣悬秉,就會發(fā)生沖突澄步;這時只能手動決定合并后的內(nèi)容——亦即,隨便改和泌,隨你村缸。

“ 首先 git branch一下你在哪個分支上,本節(jié)的例子出現(xiàn)上面的文本應該時在 master 上武氓。那么對于這個文本梯皿,想怎么改就怎么改,改成合并后你想要的文本就行县恕。甚至不修改东羹,直接保持上面原文。只要在 merge 操作提示沖突后再進行一個 add 和 commit 忠烛,至于進行這個操作前你對 master 分支里的 readme.txt 進行怎樣的修改都行 修改完畢后属提,git add 然后 git commit,就已經(jīng) merge 了美尸。”——網(wǎng)友討論冤议。

所以,git merge 只是一種嘗試师坎,或者一種提示求类;根據(jù)沖突的提示,由你來決定合并后的版本屹耐。合并過程與兩個涉及到的分支都沒關系尸疆。

機智網(wǎng)友的討論:

我說一點自己的理解,不知道對不對盎塘搿寿弱?造成沖突的原因就是多個分支同時對同一文件進行了修改,有點像是樹節(jié)點有了多個兒子按灶,當合并時症革,HEAD就不知道該往哪里走了,所以只能保留某一個分支的修改內(nèi)容鸯旁,然后進行合并噪矛。所以量蕊,在實際中,我們在同一時間應該利用某一個分支最好只操作固定的文件艇挨,避免沖突的發(fā)生残炮?不知道我以上說的對不對。

你說的這種辦法絕對不會造成沖突缩滨,可是我們在工作學習中不能削足適履吧势就?已經(jīng)提供了這種在不同分支中沖突的解決辦法,為什么還要害怕沖突產(chǎn)生呢脉漏?

當兩條分支對同一個文件的同一個文本塊進行了不同的修改苞冯,并試圖合并時,Git不能自動合并的侧巨,稱之為沖突(conflict)舅锄。解決沖突需要人工處理


廖老師,你好司忱,我 merge 成功之后(已解決了沖突)皇忿,發(fā)現(xiàn) master 分支和 feature1 分支中的 readme.txt 的內(nèi)容不一樣....

廖雪峰:對,因為你解決沖突后 master 多了一個新的 commit烘贴,正常情況可以把 master 再 merge 到 feature1 使兩者保持一致

正常情況可以把 master 再 merge 到 feature1 使兩者保持一致,不過沒有必要撮胧,因為之前 merge 過了桨踪,并且已經(jīng)修改過了(解決沖突)。修改之后 feature1 就沒有作用了芹啥,可以刪掉锻离。


master 是穩(wěn)定版,然后你此時要開發(fā)一個功能 a墓怀,你開一個新分支去開發(fā)汽纠,開發(fā)完后再合并到 master,這時 master 才有功能a傀履,大概這樣吧…

用帶參數(shù)的 git log 查看分支的合并情況:
git log --graph --pretty=oneline --abbrev-commit

`git log --graph --pretty=oneline --abbrev-commit`

分支管理策略

之前合并分支時虱朵,默認用的是Fast-forward模式,但這種模式下钓账,刪除分支后碴犬,會丟掉分支信息

默認的Fast-forward和用參數(shù)--no-ff關閉快速模式:

Fast-forward
--no-ff
git merge dev
git merge --no-ff dev

刪除dev分支后再看:

git branch -d dev
git branch -d dev

重新做了個實驗梆暮,在 master 中新建 a.txt服协,空的;新建并切換到分支 dev啦粹,分3次添加 aaaa偿荷,bbbb窘游,cccc;再切換回 master跳纳,合并忍饰,分別用默認 Fast-forward 和 --no-ff ;最后刪除 dev 分支棒旗,查看分支圖:

git merge dev
git merge --no-ff dev -m 'master merge dev with --no-ff'

也許最關鍵的后果是喘批,造成了 dev 分支 commit 記錄和 master 的 commit 記錄的混亂吧。想想 Fast-forward 的實現(xiàn)方式铣揉,移動指針饶深。
而用 --no-ff 就可以在即使 dev 刪除后也能保留 dev 的 commit 記錄,清晰的區(qū)分開來逛拱。


另敌厘,當有沖突時,就不再是 Fast-forward 了(你都動手了)朽合,這時就轉為了 --no-ff俱两,自然可以保留 dev 分支記錄 or 合并記錄。不要迷惑了曹步。

下面這張圖完美解釋了這個問題宪彩!

問題的關鍵點在于 master 有沒有diverged!**


分支策略

在實際開發(fā)中讲婚,我們應該按照幾個基本原則進行分支管理:
首先尿孔,master分支應該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本筹麸,平時不能在上面干活活合;
那在哪干活呢?干活都在dev分支上物赶,也就是說白指,dev分支是不穩(wěn)定的,到某個時候酵紫,比如1.0版本發(fā)布時告嘲,再把dev分支合并到master上,在master分支發(fā)布1.0版本奖地;
你和你的小伙伴們每個人都在dev分支上干活状蜗,每個人都有自己的分支,時不時地往dev分支上合并就可以了鹉动。
所以轧坎,團隊合作的分支看起來就像這樣:

合并分支時,加上--no-ff參數(shù)就可以用普通模式合并泽示,合并后的歷史有分支缸血,能看出來曾經(jīng)做過合并蜜氨,而Fast forward合并就看不出來曾經(jīng)做過合并。

保存當前工作 [現(xiàn)場]

在切換分支前捎泻,當前的工作現(xiàn)場必須是“working tree clean”的狀態(tài)飒炎;即不能有沒 staged 的修改,或未 commit 的 stage笆豁;否則在切換前會有提示:

working tree not clean before git checkout another-branch

Your local changes to the following files would be overwritten by checkout: a.txt. Please commit your changes or stash them before you switch branches. Aborting.

提示要么提交郎汪,要么 stash,隱藏當前工作現(xiàn)場闯狱;

git stash:保存并隱藏當前工作現(xiàn)場煞赢,待以后恢復;(stash:隱藏)

git stash

然后就可以愉快的切換分支了哄孤。

再回來照筑,用git stash list查看隱藏的工作現(xiàn)場:

git stash list

然后用git stash pop恢復并刪除分支:

git stash pop
  • git stash apply:恢復工作現(xiàn)場;
  • git stash drop:刪除隱藏的工作現(xiàn)場瘦陈;
  • git stash pop:恢復并刪除凝危;

修復bug時,我們會通過創(chuàng)建新的bug分支進行修復晨逝,然后合并蛾默,最后刪除;

當手頭工作沒有完成時捉貌,先把工作現(xiàn)場git stash一下支鸡,然后去修復bug,修復后昏翰,再git stash pop苍匆,回到工作現(xiàn)場刘急。

刪除分支時的一點小問題

軟件開發(fā)中棚菊,總有無窮無盡的新的功能要不斷添加進來。

添加一個新功能時叔汁,你肯定不希望因為一些實驗性質的代碼统求,把主分支搞亂了,所以据块,每添加一個新功能码邻,最好新建一個feature分支,在上面開發(fā)另假,完成后像屋,合并,最后边篮,刪除該feature分支己莺。

但就在 feature 分支的新功能開發(fā)完畢奏甫,切換回 dev 分支準備合并時,接到上級命令凌受,因經(jīng)費不足阵子,新功能必須取消!

雖然白干了胜蛉,但是這個分支還是必須就地銷毀:git branch -d dev

git branch -d dev

但是提示:dev 分支還沒有被合并挠进,如果確定要刪除,用git branch -D dev

照做誊册,OK.

多人協(xié)作

當你從遠程倉庫克隆時领突,實際上Git自動把本地的 master 分支和遠程的master 分支對應起來了,并且解虱,遠程倉庫的默認名稱是 origin 攘须。

git remote:查看遠程倉庫信息;
或者git remote -v查看更詳細的信息:

git remote -v

上面顯示了可以抓取和推送的 origin 的地址殴泰。如果沒有推送權限于宙,就看不到 push 的地址。

git push origin <branch-name>:推送某個分支到遠程倉庫悍汛;

原來你的遠程 origin 倉庫里只有 master 分支捞魁,現(xiàn)在你推送 dev 分支,那么 origin 里就會新出現(xiàn)一個 dev 分支离咐。origin 是 倉 庫 名 谱俭,可以容納很多分支

現(xiàn)在宵蛀,另一個人參與進來昆著,他在他的電腦上 clone 這個倉庫:git clone https://xxxxxx.git但是术陶,他用git branch查看分支時凑懂,發(fā)現(xiàn) 只 能 [看 到] master 分支,dev 分支 [看] 不 到N喙:

clone 下來的只有 master 分支接谨,沒有 dev !

是的塘匣,這時需要你手動把他找出來:
git checkout -b dev origin/dev

git checkout -b dev origin/dev

我這里為什么猜測是 [看不到]脓豪,而不是根本沒有拷貝下來?因為這句命令回車后沒有拷貝的過程忌卤!瞬間完成扫夜。

就行來就可以在本地的 dev 分支上繼續(xù)工作了。

多人協(xié)作

完整故事看這里


多人協(xié)作的工作模式通常是這樣:

  1. 首先笤闯,可以試圖用git push origin branch-name推送自己的修改现拒;
  2. 如果推送失敗,則因為遠程分支比你的本地更新望侈,需要先用git pull試圖合并印蔬;
  3. 如果合并有沖突,則解決沖突脱衙,并在本地提交侥猬;
  4. 沒有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功捐韩!

如果git pull提示 “no tracking information”退唠,則說明本地分支和遠程分支的鏈接關系沒有創(chuàng)建,用命令git branch --set-upstream-to=origin/branch-name荤胁。

這就是多人協(xié)作的工作模式瞧预,一旦熟悉了,就非常簡單仅政。


使用標簽

標簽(tag)也指向某個 commit垢油,作用是為某次 commit 取個別名——因為 commit id 是一串無規(guī)律的數(shù)字,記不住圆丹。類似于 ip 地址和域名的關系滩愁。

其余

  • 忽略某些文件時,需要編寫.gitignore辫封;
  • .gitignore文件本身要放到版本庫里硝枉,并且可以對.gitignore做版本管理!
為命令配置別名

上面哪個顯示分支圖的命令還記得嗎倦微?
git log --graph --pretty=oneline --abbrev-commit妻味;
還有一個顏色、格式更好欣福,但更長的版本:
git 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.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

lg就是后面一大串的別名裁良。

然后就可以git lg了凿将!

git 全局的配置文件在C:\Users\xiao\.gitconfig

.gitconfig

Done!

終于到了期末總結的時刻了价脾!

經(jīng)過幾天的學習牧抵,相信你對Git已經(jīng)初步掌握。一開始,可能覺得Git上手比較困難犀变,尤其是已經(jīng)熟悉SVN的童鞋妹孙,沒關系,多操練幾次获枝,就會越用越順手蠢正。

Git雖然極其強大,命令繁多省店,但常用的就那么十來個嚣崭,掌握好這十幾個常用命令,你已經(jīng)可以得心應手地使用Git了懦傍。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雹舀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粗俱,更是在濱河造成了極大的恐慌说榆,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寸认,死亡現(xiàn)場離奇詭異签财,居然都是意外死亡,警方通過查閱死者的電腦和手機偏塞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門荠卷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烛愧,你說我怎么就攤上這事油宜。” “怎么了怜姿?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵慎冤,是天一觀的道長。 經(jīng)常有香客問我沧卢,道長蚁堤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任但狭,我火速辦了婚禮披诗,結果婚禮上,老公的妹妹穿的比我還像新娘立磁。我一直安慰自己呈队,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布唱歧。 她就那樣靜靜地躺著宪摧,像睡著了一般粒竖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上几于,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天蕊苗,我揣著相機與錄音,去河邊找鬼沿彭。 笑死朽砰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的喉刘。 我是一名探鬼主播锅移,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饱搏!你這毒婦竟也來了非剃?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤推沸,失蹤者是張志新(化名)和其女友劉穎备绽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鬓催,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡肺素,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宇驾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倍靡。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖课舍,靈堂內(nèi)的尸體忽然破棺而出塌西,到底是詐尸還是另有隱情,我是刑警寧澤筝尾,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布捡需,位于F島的核電站,受9級特大地震影響筹淫,放射性物質發(fā)生泄漏站辉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一损姜、第九天 我趴在偏房一處隱蔽的房頂上張望饰剥。 院中可真熱鬧,春花似錦摧阅、人聲如沸汰蓉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽古沥。三九已至,卻和暖如春娇跟,著一層夾襖步出監(jiān)牢的瞬間岩齿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工苞俘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盹沈,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓吃谣,卻偏偏與公主長得像乞封,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岗憋,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容