git筆記
創(chuàng)建版本庫(kù)(repository)
-
創(chuàng)建一個(gè)空目錄:
$ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit -
通過(guò)
git init把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù):$ git init
把文件添加到版本庫(kù)
一定要放到learngit目錄下(子目錄亦可)
-
git add把文件添加到倉(cāng)庫(kù)$ git add readme.txt -
git commit告訴Git, 把文件提交到倉(cāng)庫(kù)$ git commit -m "wrote a readme file"
git status 可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài)
gti diff 可以看到做了什么修改
版本回退
-
HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id。 - 穿梭前,用
git log可以查看提交歷史,以便確定要回退到哪個(gè)版本。 - 要重返未來(lái),用
git reflog查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本。
撤銷修改
git checkout -- file可以丟棄工作區(qū)的修改:
一種是readme.txt自修改后還沒(méi)有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài);
一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。
總之,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)。
刪除文件
$ git rm test.txt
遠(yuǎn)程倉(cāng)庫(kù)
-
創(chuàng)建SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com" -
登錄GitHub,打開(kāi)“Account settings”,“SSH Keys”頁(yè)面;
然后,點(diǎn)“Add SSH Key”,填上任意Title,在Key文本框里粘貼
id_rsa.pub文件的內(nèi)容。
添加遠(yuǎn)程庫(kù)
登陸GitHub,然后,在右上角找到“Create a new repo”按鈕,創(chuàng)建一個(gè)新的倉(cāng)庫(kù)
我們根據(jù)GitHub的提示,在本地的
learngit倉(cāng)庫(kù)下運(yùn)行命令遠(yuǎn)程庫(kù)的名字就是
origin,這是Git默認(rèn)的叫法,也可以改成別的,但是origin這個(gè)名字一看就知道是遠(yuǎn)程庫(kù)-
把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,用
git push命令,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。由于遠(yuǎn)程庫(kù)是空的,我們第一次推送
master分支時(shí),加上了-u參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái),在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。 -
從現(xiàn)在起,只要本地作了提交,就可以通過(guò)命令
$ git push origin master
從遠(yuǎn)程庫(kù)克隆
登陸GitHub,創(chuàng)建一個(gè)新的倉(cāng)庫(kù),名字叫
gitskills-
用命令
git clone克隆一個(gè)本地庫(kù)$ git clone git@github.com:michaelliao/gitskills.git
創(chuàng)建與合并分支
-
創(chuàng)建
dev分支,然后切換到dev分支:$ git checkout -b devgit checkout命令加上-b參數(shù)表示創(chuàng)建并切換,相當(dāng)于以下兩條命令:$ git branch dev $ git checkout dev -
用
git branch命令查看當(dāng)前分支:$ git branch -
dev分支的工作完成,我們就可以切換回master分支$ git checkout master -
把
dev分支的工作成果合并到master分支上$ git merge dev -
刪除
dev分支$ git branch -d dev
解決沖突
git status可以告訴我們沖突的文件直接查看沖突文件內(nèi)容,Git用
<<<<<<<,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容-
帶參數(shù)的
git log也可以看到分支的合并情況$ git log --graph --pretty=oneline --abbrev-commit
分支管理策略
Bug分支
當(dāng)手頭工作沒(méi)有完成時(shí),先把工作現(xiàn)場(chǎng)git stash一下,然后去修復(fù)bug,修復(fù)后,再git stash pop,回到工作現(xiàn)場(chǎng)。
多人協(xié)作
多人協(xié)作的工作模式通常是這樣:
- 首先,可以試圖用
git push origin branch-name推送自己的修改; - 如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新,需要先用
git pull試圖合并; - 如果合并有沖突,則解決沖突,并在本地提交;
- 沒(méi)有沖突或者解決掉沖突后,再用
git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,則說(shuō)明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒(méi)有創(chuàng)建,用命令git branch --set-upstream branch-name origin/branch-name。
- 查看遠(yuǎn)程庫(kù)信息,使用
git remote -v; - 本地新建的分支如果不推送到遠(yuǎn)程,對(duì)其他人就是不可見(jiàn)的;
- 從本地推送分支,使用
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,如果有沖突,要先處理沖突。
創(chuàng)建標(biāo)簽
- 命令
git tag用于新建一個(gè)標(biāo)簽,默認(rèn)為HEAD,也可以指定一個(gè)commit id; -
git tag -a -m "blablabla..."可以指定標(biāo)簽信息; -
git tag -s -m "blablabla..."可以用PGP簽名標(biāo)簽; - 命令
git tag可以查看所有標(biāo)簽。
- 命令
git push origin可以推送一個(gè)本地標(biāo)簽; - 命令
git push origin --tags可以推送全部未推送過(guò)的本地標(biāo)簽; - 命令
git tag -d可以刪除一個(gè)本地標(biāo)簽; - 命令
git push origin :refs/tags/可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。
操作標(biāo)簽
- 命令
git push origin可以推送一個(gè)本地標(biāo)簽; - 命令
git push origin --tags可以推送全部未推送過(guò)的本地標(biāo)簽; - 命令
git tag -d可以刪除一個(gè)本地標(biāo)簽; - 命令
git push origin :refs/tags/可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。