Git

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137586810169600f39e17409a4358b1ac0d3621356287000

自學(xué)總結(jié)的

創(chuàng)建一個版本庫非常簡單罕伯,首先啤它,選擇一個合適的地方,創(chuàng)建一個空目錄:

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

pwd命令用于顯示當(dāng)前目錄

通過git init命令把這個目錄變成Git可以管理的倉庫:

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

編寫一個 readme.txt

Git is a version control system.
Git is free software.

第一步骏全,用命令git add告訴Git裳仆,把文件添加到倉庫:

$ git add readme.txt

無反應(yīng)正常

第二步卸耘,用命令git commit告訴Git坦辟,把文件提交到倉庫:

$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

commit可以一次提交很多文件诅岩,所以你可以多次add不同的文件

小結(jié):
初始化一個Git倉庫沪曙,使用git init命令奕污。
添加文件到Git倉庫,分兩步:
使用命令git add <file>液走,注意碳默,可反復(fù)多次使用,添加多個文件缘眶;
使用命令git commit -m <message>嘱根,完成。

git status命令可以讓我們時刻掌握倉庫當(dāng)前的狀態(tài)

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   readme.txt

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

用git diff這個命令看看具體修改了什么

$ git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 Git is free software.

小結(jié):
要隨時掌握工作區(qū)的狀態(tài)巷懈,使用git status命令该抒。
如果git status告訴你有文件被修改過,用git diff可以查看修改內(nèi)容顶燕。

git log命令顯示從最近到最遠(yuǎn)的提交日志
用git log命令查看已經(jīng)修改過的版本:

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:06:15 2018 +0800

    append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

如果輸出信息太多凑保,可以加上--pretty=oneline參數(shù):

$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file

一大串字符是版本號

在Git中,用HEAD表示當(dāng)前版本

要把當(dāng)前版本append GPL回退到上一個版本add distributed涌攻,就可以使用git reset命令:

$ git reset --hard HEAD^
HEAD is now at e475afc add distributed

查看當(dāng)前版本文件的具體內(nèi)容 回到之前的上一個版本了

$ cat readme.txt
Git is a distributed version control system.
Git is free software.

再次查看git log 最新的版本就消失了欧引,想要再回來,沒有關(guān)閉的情況下恳谎,可以利用ID,長度足夠分辨就可以
版本號沒必要寫全芝此,前幾位就可以了,Git會自動去找因痛。當(dāng)然也不能只寫前一兩位婚苹,因為Git可能會找到多個版本號,就無法確定是哪一個了

$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL

如果時間長鸵膏,想要恢復(fù)膊升,命令git reflog用來記錄你的每一次命令查找ID:

$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file

小結(jié):
HEAD指向的版本就是當(dāng)前版本,因此谭企,Git允許我們在版本的歷史之間穿梭廓译,使用命令git reset --hard commit_id结胀。
穿梭前,用git log可以查看提交歷史责循,以便確定要回退到哪個版本。
要重返未來攀操,用git reflog查看命令歷史院仿,以便確定要回到未來的哪個版本。

暫存區(qū) 工作區(qū)

git commit只更新 已經(jīng)git add的版本

用git diff HEAD -- readme.txt命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別:(沒成功速和,沒反應(yīng))

git checkout -- file可以丟棄工作區(qū)的修改

$ git checkout -- readme.txt

用命令git reset HEAD <file>可以把暫存區(qū)的修改撤銷掉(unstage)歹垫,重新放回工作區(qū),再用工作區(qū)的命令清除:

$ git reset HEAD readme.txt
Unstaged changes after reset:
M    readme.txt

小結(jié)
場景1:當(dāng)你改亂了工作區(qū)某個文件的內(nèi)容颠放,想直接丟棄工作區(qū)的修改時排惨,用命令git checkout -- file
場景2:當(dāng)你不但改亂了工作區(qū)某個文件的內(nèi)容碰凶,還添加到了暫存區(qū)時暮芭,想丟棄修改,分兩步欲低,第一步用命令git reset HEAD <file>辕宏,就回到了場景1,第二步按場景1操作砾莱。
場景3:已經(jīng)提交了不合適的修改到版本庫時瑞筐,想要撤銷本次提交,參考版本回退一節(jié)腊瑟,不過前提是沒有推送到遠(yuǎn)程庫聚假。

rm 命令可以直接刪除文件

$ rm test.txt

再用git status命令會立刻告訴你哪些文件被刪除了:

$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    test.txt

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

現(xiàn)在有兩種選擇
1.確實要從版本庫中刪除該文件,那就用命令git rm刪掉闰非,并且git commit:

$ git rm test.txt
rm 'test.txt'

$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt

2.另一種情況是刪錯了膘格,因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:

$ git checkout -- test.txt

git checkout其實是用版本庫里的版本替換工作區(qū)的版本河胎,無論工作區(qū)是修改還是刪除闯袒,都可以“一鍵還原”。

小結(jié)
命令git rm用于刪除一個文件游岳。如果一個文件已經(jīng)被提交到版本庫政敢,那么你永遠(yuǎn)不用擔(dān)心誤刪,但是要小心胚迫,你只能恢復(fù)文件到最新版本喷户,你會丟失最近一次提交后你修改的內(nèi)容。

創(chuàng)建Github賬號 新倉庫访锻,加入秘鑰 連接本地電腦
連接本地庫命令

$ git remote add origin https://github.com/15922/learngit.git

本地庫內(nèi)容推送遠(yuǎn)程

$ git push -u origin master

由于遠(yuǎn)程庫是空的褪尝,我們第一次推送master分支時闹获,加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支河哑,還會把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來避诽,在以后的推送或者拉取時就可以簡化命令。

從現(xiàn)在起璃谨,只要本地作了提交沙庐,就可以通過命令:

$ git push origin master

把本地master分支的最新修改推送至GitHub,

小結(jié)
要關(guān)聯(lián)一個遠(yuǎn)程庫佳吞,使用命令git remote add origin git@server-name:path/repo-name.git拱雏;
關(guān)聯(lián)后,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容底扳;
此后铸抑,每次本地提交后,只要有必要衷模,就可以使用命令git push origin master推送最新修改鹊汛;

克隆庫

登陸GitHub,創(chuàng)建一個新的倉庫算芯,名字叫g(shù)itskills:

勾選Initialize this repository with a README柒昏,這樣GitHub會自動為我們創(chuàng)建一個README.md文件。創(chuàng)建完畢后熙揍,可以看到README.md文件:

用命令git clone克隆一個本地庫:

$  git clone git@github.com:15922/gitskills.git
Cloning into 'gitskills'...
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

查看目錄职祷,查看文件列表

$ cd gitskills
$ ls
README.md

小結(jié)
要克隆一個倉庫,首先必須知道倉庫的地址届囚,然后使用git clone命令克隆有梆。
Git支持多種協(xié)議,包括https意系,但通過ssh支持的原生git協(xié)議速度最快泥耀。

創(chuàng)建合并分支

創(chuàng)建dev分支,然后切換到dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b參數(shù)表示創(chuàng)建并切換蛔添,相當(dāng)于以下兩條命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后痰催,用git branch命令查看當(dāng)前分支:

$ git branch
* dev
  master

把dev分支的工作成果合并到master分支上:

$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

合并完成后,就可以放心地刪除dev分支了:

$ git branch -d dev
Deleted branch dev (was b17d20e).

小結(jié)
查看分支:git branch
創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>
創(chuàng)建+切換分支:git checkout -b <name>
合并某分支到當(dāng)前分支:git merge <name>
刪除分支:git branch -d <name>

小結(jié)
當(dāng)Git無法自動合并分支時迎瞧,就必須首先解決沖突夸溶。解決沖突后,再提交凶硅,合并完成缝裁。
解決沖突就是把Git合并失敗的文件手動編輯為我們希望的內(nèi)容,再提交足绅。
用git log --graph命令可以看到分支合并圖捷绑。

小結(jié)
合并分支時韩脑,加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支粹污,能看出來曾經(jīng)做過合并段多,而fast forward合并就看不出來曾經(jīng)做過合并。

當(dāng)手頭工作沒有完成時壮吩,先把工作現(xiàn)場git stash一下衩匣,然后去修復(fù)bug,修復(fù)后粥航,再git stash pop,回到工作現(xiàn)場生百。
你可以多次stash递雀,恢復(fù)的時候,先用git stash list查看蚀浆,然后恢復(fù)指定的stash缀程,用命令:

$ git stash apply stash@{0}

添加一個新功能時,你肯定不希望因為一些實驗性質(zhì)的代碼市俊,把主分支搞亂了杨凑,所以,每添加一個新功能摆昧,最好新建一個feature分支撩满,在上面開發(fā),完成后绅你,合并伺帘,最后,刪除該feature分支忌锯。

小結(jié)
開發(fā)一個新feature伪嫁,最好新建一個分支;
如果要丟棄一個沒有被合并過的分支偶垮,可以通過git branch -D <name>強行刪除张咳。

查看遠(yuǎn)程庫的信息,用git remote:

$ git remote
origin

小結(jié)
用git remote -v顯示更詳細(xì)的信息:
查看遠(yuǎn)程庫信息似舵,使用git remote -v脚猾;
本地新建的分支如果不推送到遠(yuǎn)程,對其他人就是不可見的啄枕;
從本地推送分支婚陪,使用git push origin branch-name,如果推送失敗频祝,先用git pull抓取遠(yuǎn)程的新提交泌参;
在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支脆淹,使用git checkout -b branch-name origin/branch-name,本地和遠(yuǎn)程分支的名稱最好一致沽一;
建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)盖溺,使用git branch --set-upstream branch-name origin/branch-name;
從遠(yuǎn)程抓取分支铣缠,使用git pull烘嘱,如果有沖突,要先處理沖突蝗蛙。

小結(jié)
rebase操作可以把本地未push的分叉提交歷史整理成直線蝇庭;
rebase的目的是使得我們在查看歷史提交的變化時更容易,因為分叉的提交需要三方對比捡硅。

小結(jié)
命令git tag <tagname>用于新建一個標(biāo)簽哮内,默認(rèn)為HEAD,也可以指定一個commit id壮韭;
命令(git tag -a <tagname> -m "blablabla..." 編號)可以指定標(biāo)簽信息北发;
命令git tag可以查看所有標(biāo)簽。

小結(jié)
命令git push origin <tagname>可以推送一個本地標(biāo)簽喷屋;
命令git push origin --tags可以推送全部未推送過的本地標(biāo)簽琳拨;
命令git tag -d <tagname>可以刪除一個本地標(biāo)簽;
命令git push origin :refs/tags/<tagname>可以刪除一個遠(yuǎn)程標(biāo)簽屯曹。

小結(jié)
忽略某些文件時狱庇,需要編寫.gitignore;
.gitignore文件本身要放到版本庫里恶耽,并且可以對.gitignore做版本管理僵井!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市驳棱,隨后出現(xiàn)的幾起案子批什,更是在濱河造成了極大的恐慌,老刑警劉巖社搅,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驻债,死亡現(xiàn)場離奇詭異,居然都是意外死亡形葬,警方通過查閱死者的電腦和手機合呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笙以,“玉大人淌实,你說我怎么就攤上這事。” “怎么了拆祈?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵恨闪,是天一觀的道長。 經(jīng)常有香客問我放坏,道長咙咽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任淤年,我火速辦了婚禮钧敞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘麸粮。我一直安慰自己溉苛,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布弄诲。 她就那樣靜靜地躺著炊昆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪威根。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天视乐,我揣著相機與錄音洛搀,去河邊找鬼。 笑死佑淀,一個胖子當(dāng)著我的面吹牛留美,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伸刃,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谎砾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捧颅?” 一聲冷哼從身側(cè)響起景图,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碉哑,沒想到半個月后挚币,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡扣典,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年妆毕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮尖。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡笛粘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情薪前,我是刑警寧澤润努,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站序六,受9級特大地震影響任连,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜例诀,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一随抠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧繁涂,春花似錦拱她、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矿酵,卻和暖如春唬复,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背全肮。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工敞咧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辜腺。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓休建,卻偏偏與公主長得像,于是被迫代替她去往敵國和親评疗。 傳聞我的和親對象是個殘疾皇子测砂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

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