遠(yuǎn)程倉(cāng)庫(kù)
登陸GitHub,創(chuàng)建一個(gè)新的倉(cāng)庫(kù),Repository name叫做learngit,創(chuàng)建成功后,在GitHub上的這個(gè)learngit倉(cāng)庫(kù)還是空的,GitHub告訴我們,可以從這個(gè)倉(cāng)庫(kù)克隆出新的倉(cāng)庫(kù),也可以把一個(gè)已有的本地倉(cāng)庫(kù)與之關(guān)聯(lián)。然后,把本地倉(cāng)庫(kù)的內(nèi)容推送到GitHub倉(cāng)庫(kù)。
我們根據(jù)GitHub的提示,在本地的learngit倉(cāng)庫(kù)下運(yùn)行命令:
$git remote add origin git@github.com:fanfafafanfan/learngit.git
注意:fanfafafanfan是我的GitHub賬戶名
添加后,遠(yuǎn)程庫(kù)的名字就是origin,這是Git默認(rèn)的叫法,也可以改成別的,但是origin這個(gè)名字一看就知道是遠(yuǎn)程庫(kù)。
下一步,就可以把本地庫(kù)的所有內(nèi)容推送到遠(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)在起,只要本地作了提交(git add),就可以通過(guò)命令:
$git push origin master
把本地master分支的最新修改推送至GitHub
注:如果是一個(gè)新項(xiàng)目
git init?//在當(dāng)前項(xiàng)目工程下履行這個(gè)號(hào)令相當(dāng)于把當(dāng)前項(xiàng)目git化,變身!
git add .//把當(dāng)前目次下代碼參加git的跟蹤中,意思就是交給git經(jīng)管,提交到本地庫(kù)
git add <file>//把當(dāng)前文件參加的git的跟蹤中,交給git經(jīng)管,提交到本地庫(kù)
git commit -m "…"http://寫點(diǎn)提交信息
git remote add origin?git@github.com:ellocc/gittest.git?//這個(gè)相當(dāng)于指定本地庫(kù)與github上的哪個(gè)項(xiàng)目相連
git push -u origin master?//將本地庫(kù)提交到github上。
錯(cuò)誤總結(jié)
本地倉(cāng)庫(kù)初始化并添加遠(yuǎn)程倉(cāng)庫(kù)后使用:

解決方法:

其他錯(cuò)誤:
錯(cuò)誤提示:fatal: remote origin already exists.
解決辦法:$ git remote rm origin
錯(cuò)誤提示:error: failed to push some refs to ........
解決辦法:$ git pull origin master //先pull 下來(lái) 再push 上去
從遠(yuǎn)程庫(kù)克隆
$ git clone

要克隆一個(gè)倉(cāng)庫(kù),首先必須知道倉(cāng)庫(kù)的地址,然后使用git clone命令克隆。
Git支持多種協(xié)議,包括https,但通過(guò)ssh支持的原生git協(xié)議速度最快。
創(chuàng)建與合并分支
一開始的時(shí)候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點(diǎn):

當(dāng)我們創(chuàng)建新的分支,例如dev時(shí),Git新建了一個(gè)指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當(dāng)前分支在dev上:

從現(xiàn)在開始,對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了,比如新提交一次后,dev指針往前移動(dòng)一步,而master指針不變:

假如我們?cè)赿ev上的工作完成了,就可以把dev合并到master上。直接把master指向dev的當(dāng)前提交,就完成了合并:

合并完分支后,甚至可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,我們就剩下了一條master分支:

操作:





查看分支: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>
用帶參數(shù)的git log可以看到分支的合并情況:
$ git log --graph --pretty=oneline --abbrev-commit
分支管理策略


合并分支時(shí),加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來(lái)曾經(jīng)做過(guò)合并,而fast forward合并就看不出來(lái)曾經(jīng)做過(guò)合并。
Bug 分支
修復(fù)bug時(shí),我們會(huì)通過(guò)創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并,最后刪除;
當(dāng)手頭工作沒(méi)有完成時(shí),先把工作現(xiàn)場(chǎng)git stash一下,然后去修復(fù)bug,修復(fù)后,再回到原工作分支,git stash pop,回到工作現(xiàn)場(chǎng)。
git stash list 查看工作現(xiàn)場(chǎng)存儲(chǔ)的地方
回復(fù)工作現(xiàn)場(chǎng)的兩種方法:
一是用git stash apply恢復(fù),但是恢復(fù)后,stash內(nèi)容并不刪除,你需要用git stash drop來(lái)刪除;
另一種方式是用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪了。
你可以多次stash查看工作現(xiàn)場(chǎng)存儲(chǔ)的信息,恢復(fù)的時(shí)候,先用git stash list查看,然后恢復(fù)指定的stash,用命令:
$git stash apply stash@{0}
強(qiáng)行刪除新的feature分支
開發(fā)一個(gè)新feature,最好新建一個(gè)分支;
如果要丟棄一個(gè)沒(méi)有被合并過(guò)的分支,可以通過(guò)git branch -D 強(qiáng)行刪除
查看遠(yuǎn)程庫(kù)信息,使用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,如果有沖突,要先處理沖突。
Tag標(biāo)簽
首先,切換到需要打標(biāo)簽的分支上:
$ git branch
* dev?
master
$ git checkout master
Switched to branch 'master'
然后,敲命令git tag 就可以打一個(gè)新標(biāo)簽:
$ git tag?
v1.0
如果想要在以前提交的commit上打標(biāo)簽,那么找到歷史提交的commit id,然后打上就好了。
$ git log --pretty=oneline --abbrev-commit
6a5819e merged bug fix 101
cc17032 fix bug 101
7825a50 merge with no-ff
6224937 add merge
...
比方說(shuō)要對(duì)add merge這次提交打標(biāo)簽,它對(duì)應(yīng)的commit id是6224937,敲入命令:
$ git tag v0.9 6224937
再用命令git tag查看標(biāo)簽:
$ git tag
v0.9
v1.0
注意,標(biāo)簽不是按時(shí)間順序列出,而是按字母排序的??梢杂胓it show 查看標(biāo)簽信息:
$ git show v0.9
commit 622493706ab447b6bb37e4e2a2f276a20fed2ab4
Author: *****
Date:? *****
????????add merge
...
還可以創(chuàng)建帶有說(shuō)明的標(biāo)簽,用-a指定標(biāo)簽名,-m指定說(shuō)明文字:
$ git tag -a v0.1 -m "version 0.1 released" 3628164
用命令git show <tagname>可以看到說(shuō)明文字
命令git tag <tagname> 用于新建一個(gè)標(biāo)簽,默認(rèn)為HEAD,也可以指定一個(gè)commit id;
git tag -a <tagname>? -m "blablabla..."可以指定標(biāo)簽信息;
git tag -s <tagname>? -m "blablabla..."可以用PGP簽名標(biāo)簽;
命令git tag可以查看所有標(biāo)簽。
命令git push origin <tagname>?可以推送一個(gè)本地標(biāo)簽;
命令git push origin --tags 可以推送全部未推送過(guò)的本地標(biāo)簽;
命令git tag -d <tagname>?可以刪除一個(gè)本地標(biāo)簽;
命令git push origin :refs/tags/<tagname>?可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。