git學(xué)習(xí)筆記

◆◆◆特別聲明◆◆◆


本篇文章系本人學(xué)習(xí)《廖雪峰Git教程》筆記,主要用作自己復(fù)習(xí)使用。
首先向廖雪峰老師表示感謝,其次,如若本文有不妥之處,歡迎留言指正。
如需系統(tǒng)學(xué)習(xí),請(qǐng)移步——廖雪峰Git教程
Windows上需要安裝Git,下載地址


◆◆◆Git基礎(chǔ)◆◆◆


  • Linus花了兩周時(shí)間自己用C寫了一個(gè)分布式版本控制系統(tǒng),這就是Git!一個(gè)月之內(nèi),Linux系統(tǒng)的源碼已經(jīng)由Git管理了!牛是怎么定義的呢?大家可以體會(huì)一下。
    Git迅速成為最流行的分布式版本控制系統(tǒng),尤其是2008年,GitHub網(wǎng)站上線了,它為開源項(xiàng)目免費(fèi)提供Git存儲(chǔ),無數(shù)開源項(xiàng)目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。
    歷史就是這么偶然,如果不是當(dāng)年BitMover公司威脅Linux社區(qū),可能現(xiàn)在我們就沒有免費(fèi)而超級(jí)好用的Git了。
  • 注意git config命令的--global參數(shù),用了這個(gè)參數(shù),表示你這臺(tái)機(jī)器上所有的Git倉庫都會(huì)使用這個(gè)配置,當(dāng)然也可以對(duì)某個(gè)倉庫指定不同的用戶名和Email地址。
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
  • 初始化一個(gè)Git倉庫,使用git init命令。
  • 添加文件到Git倉庫,分兩步:
    第一步,使用命令git add <file>,注意,可反復(fù)多次使用,添加多個(gè)文件;
    第二步,使用命令git commit,完成。
  • 要隨時(shí)掌握工作區(qū)的狀態(tài),使用git status命令。
  • 如果git status告訴你有文件被修改過,用git diff可以查看修改內(nèi)容。
  • HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id。
    穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個(gè)版本。
    要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個(gè)版本。
  • 命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區(qū)的修改全部撤銷,這里有兩種情況:
    一種是readme.txt自修改后還沒有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài);
    一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。
    總之,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)。
    git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個(gè)分支”的命令。
    -用命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū):
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt

場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí),用命令git checkout -- file
場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí),想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
場景3:已經(jīng)提交了不合適的修改到版本庫時(shí),想要撤銷本次提交,參考版本回退一節(jié),不過前提是沒有推送到遠(yuǎn)程庫。

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

◆◆◆遠(yuǎn)程倉庫◆◆


  • 第一步:登陸GitHub,然后,在右上角找到“Create a new repo”按鈕,創(chuàng)建一個(gè)新的倉庫
  • 第二步:把一個(gè)已有的本地倉庫與之關(guān)聯(lián),要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫,使用命令
git remote add origin git@server-name:path/repo-name.git;

把本地庫的內(nèi)容推送到遠(yuǎn)程,用git push命令,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。
由于遠(yuǎn)程庫是空的,我們第一次推送master分支時(shí),加上了-u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時(shí)就可以簡化命令。


◆◆◆分支管理◆◆◆


查看分支: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>


  • 解決沖突

當(dāng)Git無法自動(dòng)合并分支時(shí),就必須首先解決沖突。解決沖突后,再提交,合并完成。
git log --graph命令可以看到分支合并圖。


linux系統(tǒng) vim編輯器

**
i——編輯模式
編輯完之后按下Esc后結(jié)合Shift輸入
保存退出 :wq
直接退出 :q
只讀模式需要強(qiáng)制保存然后退出 :w! 然后:q
**


  • 分支管理策略

通常,合并分支時(shí),如果可能,Git會(huì)用Fast forward模式,但這種模式下,刪除分支后,會(huì)丟掉分支信息。
如果要強(qiáng)制禁用Fast forward模式,Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣,從分支歷史上就可以看出分支信息。

Fast forward模式

--no-ff方式
  • 在實(shí)際開發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
    1、master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本,平時(shí)不能在上面干活;
    2、那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩(wěn)定的,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí),再把dev分支合并到master上,在master分支發(fā)布1.0版本;你和你的小伙伴們每個(gè)人都在dev分支上干活,每個(gè)人都有自己的分支,時(shí)不時(shí)地往dev分支上合并就可以了。
    所以,團(tuán)隊(duì)合作的分支看起來就像這樣:
    git-br-policy
  • 小結(jié)
    Git分支十分強(qiáng)大,在團(tuán)隊(duì)開發(fā)中應(yīng)該充分應(yīng)用。
    合并分支時(shí),加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來曾經(jīng)做過合并,而fast forward合并就看不出來曾經(jīng)做過合并。

  • bug分支

修復(fù)bug時(shí),我們會(huì)通過創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并,最后刪除;
當(dāng)手頭工作沒有完成時(shí),先把工作現(xiàn)場git stash一下,然后去修復(fù)bug,修復(fù)后,再git stash pop,回到工作現(xiàn)場。
工作現(xiàn)場還在,Git把stash內(nèi)容存在某個(gè)地方了,但是需要恢復(fù)一下,有兩個(gè)辦法:
一是用git stash apply恢復(fù),但是恢復(fù)后,stash內(nèi)容并不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪了:
再用git stash list
查看,就看不到任何stash內(nèi)容了:
你可以多次stash,恢復(fù)的時(shí)候,先用git stash list查看,然后恢復(fù)指定的stash,用命令:

$ git stash apply stash@{0}

  • Feature分支

軟件開發(fā)中,總有無窮無盡的新的功能要不斷添加進(jìn)來。
添加一個(gè)新功能時(shí),你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了,所以,每添加一個(gè)新功能,最好新建一個(gè)feature分支,在上面開發(fā),完成后,合并,最后,刪除該feature分支。
如果要丟棄一個(gè)沒有被合并過的分支,可以通過git branch -D <name>強(qiáng)行刪除。


  • 多人協(xié)作

從遠(yuǎn)程庫clone時(shí),默認(rèn)情況下,只能看到本地的master分支。可以用git branch命令看看

  $ git branch
  * master

創(chuàng)建遠(yuǎn)程origindev分支到本地

$ git checkout -b dev origin/dev

指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接

$ git branch --set-upstream dev origin/dev
Branch dev set up to track remote branch dev from origin.

多人協(xié)作的工作模式通常是這樣:
首先,可以試圖用git push origin branch-name推送自己的修改;
如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新,需要先用git pull試圖合并
如果合并有沖突,則解決沖突,并在本地提交;
沒有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream branch-name origin/branch-name。
這就是多人協(xié)作的工作模式,一旦熟悉了,就非常簡單。
小結(jié)
查看遠(yuǎn)程庫信息,使用git remote -v;
本地新建的分支如果不推送到遠(yuǎn)程,對(duì)其他人就是不可見的;
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠(yuǎn)程的新提交;
在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(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,如果有沖突,要先處理沖突。

  • 標(biāo)簽管理

本地
命令git tag <name>用于新建一個(gè)標(biāo)簽,默認(rèn)為HEAD,也可以指定一個(gè)commit id
git show <tagname>查看標(biāo)簽信息;
git tag -a <tagname> -m "blablabla..."可以指定標(biāo)簽信息;
命令git tag可以查看所有標(biāo)簽;
查看歷史提交的commit id:git log --pretty=oneline --abbrev-commit
遠(yuǎn)程
命令git push origin <tagname>可以推送一個(gè)本地標(biāo)簽;
命令git push origin --tags可以推送全部未推送過的本地標(biāo)簽;
命令git tag -d <tagname>可以刪除一個(gè)本地標(biāo)簽;
命令git push origin :refs/tags/<tagname>可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。

  • 刪除github上的遠(yuǎn)程分支

$ git push 【你的遠(yuǎn)程倉庫在本地的別名】【空格】【冒號(hào)】【你的分支名字】
git push origin :branch_name(The name of the remote branch should be removed)

◆◆◆本地分支&遠(yuǎn)程分支那些事兒◆◆◆


當(dāng)你從遠(yuǎn)程倉庫克隆時(shí),實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對(duì)應(yīng)起來了,并且,遠(yuǎn)程倉庫的默認(rèn)名稱是origin
當(dāng)你的小伙伴從遠(yuǎn)程庫clone時(shí),默認(rèn)情況下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看。
現(xiàn)在,你的小伙伴要在dev分支上開發(fā),就必須創(chuàng)建遠(yuǎn)程origindev分支到本地,分三種情況:

  1. 本地沒有dev分支,遠(yuǎn)程也沒有dev分支,這種情況一般出現(xiàn)在你接手一個(gè)新項(xiàng)目,而遠(yuǎn)程庫只有個(gè)master分支。
    • 本地創(chuàng)建dev分支:git checkout -b dev
    • dev分支推送到遠(yuǎn)程:git push origin dev
  2. 本地沒有dev分支,遠(yuǎn)程dev分支,此時(shí)只需要git checkout -b dev origin/dev
  3. 本地dev分支,遠(yuǎn)程dev分支,但是二者沒有關(guān)聯(lián)
if local branch foo is the current branch:
git branch -u origin/foo

Or, if local branch foo is not the current branch:
git branch -u origin/foo foo

Or, if you like to type longer commands, these are equivalent to the above two:
git branch --set-upstream-to=upstream/foo
git branch --set-upstream-to=upstream/foo foo

◆◆◆移除某個(gè)文件的版本控制◆◆◆

git rm -r --cache xxx
然后在.gitignore中過濾該文件即可

◆◆◆ 查看本地分支和遠(yuǎn)程分支的對(duì)應(yīng)關(guān)系 ◆◆◆

git branch -vv

◆◆◆git常用命令:修改上一次commit的提交信息 ◆◆◆

git commit --amend -m "New commit message"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容