Git 命令及版本管理詳細(xì)使用

序言:目前去枷,Git是比較流行的版本管理系統(tǒng)久免。相比于SVN,我更偏愛(ài)Git! 本文將詳細(xì)介紹使用Git的一些心得谢揪。

什么是Git?

Git是一種分布式版本控制系統(tǒng)(DVCS)蕉陋,也稱(chēng)為分散式。每個(gè)開(kāi)發(fā)人員都擁有存儲(chǔ)庫(kù)的完整副本拨扶,該存儲(chǔ)庫(kù)位于云中(遠(yuǎn)程倉(cāng)庫(kù))凳鬓。

安裝Git

本人使用的是Mac,終端自帶Git工具

  • Mac:通過(guò)Homebrew安裝
# 安裝homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 安裝Git
brew install git
  • Linux
sudo apt-get update
sudo apt-get install git

使用Git

創(chuàng)建本地存儲(chǔ)庫(kù)

git init
開(kāi)發(fā)
  • 執(zhí)行完git init后本地倉(cāng)庫(kù)已初始化完成患民。ls -a可以查看到.git的隱藏文件

更新倉(cāng)庫(kù)內(nèi)容

創(chuàng)建文件并修改內(nèi)容
# 創(chuàng)建一個(gè)README文件
touch READEM.md
# 寫(xiě)入一些內(nèi)容到READEM.md
echo 'hello,world' >> READEM.md
# 打印READEM.md文件內(nèi)容
cat READEM.md
創(chuàng)建文件
查看倉(cāng)庫(kù)狀態(tài)
git status
# 或者 git status -s
查看倉(cāng)庫(kù)狀態(tài)
將變更的文件納入版本管理
git add .
# . 是將所有的文件遞歸納入版本管理缩举,若單個(gè)添加git add READEM.md 即可
納入版本管理
將納入版本管理的文件提交到本地倉(cāng)庫(kù)
git commit -m 'first commit'
提交
查看日志
git log  # 命令是查看全部提交日志  
git log -2  # 查看最近2次的提交日志  
git log -p  # 查看歷史紀(jì)錄以來(lái)哪幾行被修改  
git log --stat --summary # 查看每個(gè)版本變動(dòng)的檔案和行數(shù) 
查看日志

日志的樣式略微難看,這里給大家推薦一個(gè)配置

# 給git log起一個(gè)別名:git lg
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(red)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

# 更改之后
git lg  # 命令是查看全部提交日志  
....
查看日志

分支

創(chuàng)建分支
git branch dev1

Git創(chuàng)建分支時(shí)匹颤,它只是創(chuàng)建一個(gè)帶有該分支名稱(chēng)的指針仅孩,該指針指向已創(chuàng)建分支的commit

切換到dev1分支進(jìn)行開(kāi)發(fā)
git checkout dev1
創(chuàng)建分支和切換到dev1分支

接下來(lái)的所有操作都在dev1分支上,我們?nèi)匀粊?lái)更新倉(cāng)庫(kù)的文件內(nèi)容

touch dev1.txt
echo 'this is text file' >> dev1.txt
# 查看狀態(tài)
git status -s
# 納入版本控制
git add .
# 提交
git commit -m 'create a dev1 text file'
# 查看日志
git lg 
進(jìn)行開(kāi)發(fā)

合并分支

假設(shè)印蓖,這條分支的任務(wù)已完成辽慕,我們切換到主線master上去

git checkout master

此時(shí),我們?cè)俨榭慈罩旧馑啵](méi)有剛剛提交的'create a dev1 text file'溅蛉。原因是:之前所有的操作都在dev1分支上執(zhí)行公浪,現(xiàn)在切回到master分支自然沒(méi)有剛剛的日志記錄。在實(shí)際項(xiàng)目開(kāi)發(fā)中寫(xiě)了不就沒(méi)有意義了嗎船侧?** 所有我們要將dev1分支與master合并欠气!**

git merge dev1
合并分支
合并問(wèn)題

合并之后再次查看日志,你會(huì)發(fā)現(xiàn)并沒(méi)有存在dev1分支的存在勺爱,與我們相像的并不一致救巷,這是為何腥刹?
原因:這是因?yàn)镚it使用快進(jìn)模式(fast-forward)合并了分支须尚。這里需要注意git給我們打印的輸出信息,如上圖所示:master和dev1是共同的祖先浩螺!
** 在我們合并分支時(shí)望伦,不推薦使用fast-forward模式陆馁!可以通過(guò)--no-ff(無(wú)快進(jìn)模式)命令來(lái)處理**

# 新建分支dev2重復(fù)dev1的操作绳匀,再次合并
git merge --no-ff dev2
合并分支

合并分支

通過(guò)這種方式來(lái)合并分支台腥,可以完美的顯示分支的生命跡象投放!

刪除分支

假設(shè)分支合并完成奈泪,此分支已沒(méi)有作用,我們應(yīng)該移除此分支灸芳,以后可再次創(chuàng)建命名為dev1分支

git branch -d dev1

合并沖突

下面模擬一下合并沖突問(wèn)題涝桅!

  • 在master分支上更新倉(cāng)庫(kù)并提交
# master分支更新倉(cāng)庫(kù)并提交
echo 'this is a test log' >> README.md
git status -s
git add .
git commit -m 'readme file change content'

# master分支更新倉(cāng)庫(kù)并提交
echo 'this is two' >> README.md
git status -s
git add .
git commit -m 'readme file change content two'

# 切換到dev2分支,更新倉(cāng)庫(kù)并提交
git checkout dev2
echo 'this is dev2 change' >> README.md
git status -s
git add .
git commit -m 'readme file change content dev2 change'

# 再次切換到master分支烙样,更新倉(cāng)庫(kù)并提交
git checkout master
echo 'this is three' >> README.md
git status -s
git add .
git commit -m 'readme file change content three'

# 做完上述工作冯遂,接下來(lái)合并
合并
git merge dev2
合并分支

很顯然,合并失斱嘶瘛蛤肌!此時(shí),兩個(gè)分支的版本存在沖突批狱,Git已經(jīng)不知道怎么做了裸准。** 在master更新倉(cāng)庫(kù)并提交之后版本已經(jīng)改變,master已不是上次上傳的版本赔硫,而dev2分支還是從上一次合并的HEAD開(kāi)始炒俱;所以這時(shí)是無(wú)法合并的。而Git所做的事情是:指出存在這些內(nèi)容不兼容的部分爪膊。**

  • 接著权悟,我們看一下倉(cāng)庫(kù)狀態(tài):git status
狀態(tài)
  • 進(jìn)入README文件(vi README.md)查看更新的內(nèi)容,會(huì)發(fā)現(xiàn)多出了<<<<<<<HEAD惊完、========僵芹、>>>>>>>>dev2,這里有兩個(gè)部分:

    • 第一部分:在<<<<<<< HEAD和=======之間小槐,是master分支更新的內(nèi)容拇派;
    • 第二部分:在=======和>>>>>>> dev2之間荷辕,是dev2分支更新的內(nèi)容;


      readme文件
  • 解決辦法

    • 使用HEAD-master版本
    • 使用dev2版本
    • 兩個(gè)版本的組合
  1. 使用HEAD-master版本
# 將master分支提交的信息保留件豌,去掉dev2分支的內(nèi)容疮方,并且去掉<<<<<<<HEAD、========茧彤、>>>>>>>>dev2
# 保存如下:
this is a test log
this is two
this is three

# esc退出編輯模式骡显,快捷鍵shift + :  再輸入wq,回車(chē)即可曾掂,保存并退出
# 查看狀態(tài)
git status -s

** 在一開(kāi)始合并時(shí)惫谤,查看倉(cāng)庫(kù)狀態(tài)README文件還是Unmerge 狀態(tài),在git status -s下是紅色的:UU README.md珠洗;而現(xiàn)在是AA README.md **


readme文件
git add .
git commit -m 'save HEAD version, remove dev2 version'
# 這里雖然使用了HEAD版本溜歪,但是保存了dev2分支的生命跡象
# 合并完成,刪除dev2分支
git branch -d dev2
  1. 使用dev2版本
# 與第一種解決辦法同理
  1. 兩個(gè)版本的組合
# 兩個(gè)版本組合就是兩者都保留许蓖,所以只需要去掉<<<<<<<HEAD蝴猪、========、>>>>>>>>dev2即可
# esc退出編輯模式膊爪,快捷鍵shift + :  再輸入wq自阱,回車(chē)即可,保存并退出
git add .
git commit

版本合并完之后如下:

readme文件

版本回退(刪除)

  • 命令
git reset --hard <版本號(hào)>  # 回退到對(duì)應(yīng)的版本號(hào)米酬,這里的版本號(hào)就是日志前面的7個(gè)字符
git reset --hard -HEAD^   # 刪除最后一次提交的版本沛豌,也就是回退到最后倒數(shù)第二次版本
git reset --hard -HEAD~   # 刪除最后一次提交的版本,也就是回退到最后倒數(shù)第二次版本
git reset --hard -HEAD^^  # 刪除最后兩次次提交的版本淮逻,也就是回退到最后倒數(shù)第三次版本
.... 其他的依次類(lèi)推

強(qiáng)推到某個(gè)分支

git push origin 分支名 --force

or
git push -f origin 分支名

clone命令

在碼云或者Github上要克隆別人的代碼琼懊,需要用到clone命令

git clone <倉(cāng)庫(kù)地址:url/ssh>  # 如下圖所示

[圖片上傳失敗...(image-b0ef86-1550730346214)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爬早,隨后出現(xiàn)的幾起案子哼丈,更是在濱河造成了極大的恐慌,老刑警劉巖筛严,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醉旦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡桨啃,警方通過(guò)查閱死者的電腦和手機(jī)车胡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)照瘾,“玉大人匈棘,你說(shuō)我怎么就攤上這事∥雒” “怎么了主卫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵逃默,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我簇搅,道長(zhǎng)完域,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任瘩将,我火速辦了婚禮吟税,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姿现。我一直安慰自己肠仪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布建钥。 她就那樣靜靜地躺著藤韵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熊经。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天欲险,我揣著相機(jī)與錄音镐依,去河邊找鬼。 笑死天试,一個(gè)胖子當(dāng)著我的面吹牛槐壳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喜每,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼务唐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了带兜?” 一聲冷哼從身側(cè)響起枫笛,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刚照,沒(méi)想到半個(gè)月后刑巧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡无畔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年啊楚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浑彰。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恭理,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郭变,到底是詐尸還是另有隱情颜价,我是刑警寧澤薄风,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站拍嵌,受9級(jí)特大地震影響遭赂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜横辆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一撇他、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狈蚤,春花似錦困肩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至靖避,卻和暖如春潭枣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幻捏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工盆犁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篡九。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓谐岁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親榛臼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伊佃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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