拉取遠(yuǎn)程git項(xiàng)目的某個(gè)分支
- master分支:默認(rèn)會(huì)拉取的分支石抡,直接
git clone URL
就可以獲取到檐嚣。$ git clone https://git.oschina.net/androidJP/Demo.git
- 非master分支:需要
git fetch
和git checkout -b XXX remote倉(cāng)庫(kù)/XXX
結(jié)合使用。$ git clone https://git.oschina.net/androidJP/Demo.git ///項(xiàng)目的默認(rèn)分支被克隆下來(lái)了 $ git branch /// 輸出:如master 等已經(jīng)拉取到的分支名和當(dāng)前分支 $ git fetch $ git checkout -b develop origin/develop /// 拉取遠(yuǎn)程的develop分支并本地切換到了develop分支
本地分支pull不了
原因:你的本地分支沒(méi)有關(guān)聯(lián)上遠(yuǎn)程分支.
- 方法一:直接指定要pull哪個(gè)遠(yuǎn)程分支(默認(rèn)會(huì)merge):
$ git pull origin <遠(yuǎn)程分支名>
- 方法二:綁定某個(gè)分支啰扛,之后就直接
git pull
即可:$ git branch --set-upstream-to=origin/<遠(yuǎn)程分支名> <本地分支名>
本地創(chuàng)建一個(gè)新分支并推送到遠(yuǎn)程嚎京,讓遠(yuǎn)程也生成新分支
$ git checkout -b branchA
....
$ git add .
$ git commit -m "what you change"
/// 將本地分支推到遠(yuǎn)程的同名分支上
$ git push origin branchA
或者 (-u 的作用是選定默認(rèn)遠(yuǎn)程倉(cāng)庫(kù))
$ git push -u origin branchA
版本回滾和還原
- 回滾
- 法一:通過(guò)
git log
查看版本號(hào),然后通過(guò)版本號(hào)來(lái)定位HEAD
應(yīng)該指向哪里隐解。$ git log --pretty=oneline $ git reset --hard 12345
- 法二:通過(guò)
HEAD^
等鞍帝,回滾到上一個(gè)/上N個(gè)版本// 上個(gè)版本 $ git reset --hard HEAD^ //上上個(gè)版本 $ git reset --hard HEAD^^ // 前100個(gè)版本 $ git reset --hard HEAD~100
- 還原
原理:還是使用reset --hard <版本號(hào)>
的方式實(shí)現(xiàn),并通過(guò)git reflog
來(lái)獲取以前的git操作記錄煞茫,從而得到對(duì)應(yīng)的版本號(hào)帕涌。
$ git reflog
$ git reset --hard 12345
不小心寫(xiě)了句“老板真欠扁”,怎么辦续徽?
- 如果你已經(jīng)commit了
恭喜你蚓曼,只能用版本回滾了。(如果老板沒(méi)有你最新提交版本的版本號(hào)的話(huà)) - 幸好钦扭,我的文件還在工作區(qū)纫版,沒(méi)有被add。
///將我這個(gè)文件myFile.txt的所有修改都清空 $ git checkout -- myFile.txt
- 哦哦土全,我的文件add進(jìn)了暫存區(qū)捎琐。
// 第一步,還原 add 這個(gè)操作(暫存區(qū) --> 工作區(qū)) $ git reset HEAD myFile.txt // 第二步裹匙,清空工作區(qū)(工作區(qū) --> 未修改) $ git checkout -- myFile.txt
SSH 公約私鑰生成
///在你的用戶(hù)主目錄下的 .ssh 文件夾中生成公鑰和私鑰
$ ssh-keygen -t rsa -C "youremail@example.com"
分支的原理
- 原理:
-
HEAD
永遠(yuǎn)指向當(dāng)前分支。 - 默認(rèn):
HEAD
指向master
末秃,master
指向最新提交概页。 - 合并分支,是:站在待合并分支上练慕,將這個(gè)分支點(diǎn)的指針惰匙,指向要合并到的分支指針位置技掏。
-
-
相關(guān)命令:
分支合并與沖突解決
-
本地兩個(gè)分支的
merge
沖突解決:- 合并
$ git checkout develop $ git merge newBranch1
- 合并后,發(fā)現(xiàn)沖突项鬼,一般表現(xiàn)形式如下:
.............. <<<<<<< HEAD 分支 develop 上的內(nèi)容 ======= 分支 newBranch1上的修改內(nèi)容 >>>>>>> newBranch1
- 自己用編輯器打開(kāi)文件進(jìn)行解決哑梳。
- 最后
add
和commit
提交,這樣绘盟,就完成了一個(gè)分支的合并鸠真。
- 使用
--no-ff
禁止fast forward提交,以保留合并的分支信息龄毡,在分支被刪除后吠卷,也會(huì)保留分支的合并記錄。- 合并
$ git merge --no-ff -m "merge with no-ff" dev
- (可選)解決沖突
- 查看分支合并信息
$ git log --graph --pretty=oneline --abbrev-commit
遠(yuǎn)程倉(cāng)庫(kù)
- 創(chuàng)建
$ git remote add origin git@github.com:michaelliao/learngit.git
- 推送
/// 第一次推送沦零,-u 作用是將本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)origin 綁定 $ git push -u origin master /// 以后的推送祭隔,則不需要再次綁定了 $ git push origin master
- 查看遠(yuǎn)程庫(kù)信息
$ git remote /// 遠(yuǎn)程庫(kù)名 $ git remote -v ///詳細(xì)信息
- 查看遠(yuǎn)程分支
$ git branch -a ///查看所有分支(包括本地和遠(yuǎn)程倉(cāng)庫(kù)) $ git branch
- 刪除遠(yuǎn)程分支
$ git branch -r -d origin/develop /// 刪除遠(yuǎn)程分支develop $ git push origin :develop ///刪除遠(yuǎn)程的develop分支
log 妙用
-
git log --pretty=oneline
:?jiǎn)涡胁榭串?dāng)前分支日志 -
git log --graph --pretty=oneline
:查看當(dāng)前分支的合并情況 -
git log --graph --pretty=oneline --abbrev-commit
:和命令2效果相似。
dev分支碼到一半路操,發(fā)現(xiàn)master分支的版本有bug疾渴,要馬上改
思路:dev的修改先保存起來(lái),然后切換到master分支屯仗,再打bug分支修復(fù)bug搞坝,修復(fù)成功并合并后,最終切回dev分支祭钉,并取回之前保存的dev分支的修改內(nèi)容瞄沙,繼續(xù)碼。
步驟:
- 暫存dev工作現(xiàn)場(chǎng)
$ git stash
- 切回master, 打bug修復(fù)分支慌核,修復(fù)并合并
$ git checkout master $ git checkout -b bug-solve-101 ////修復(fù)bug中距境。。垮卓。垫桂。 $ git checkout master $ git merge --no-ff -m "bug 101修復(fù)成功" bug-solve-101
- 最終,切回dev分支粟按,并還原工作現(xiàn)場(chǎng)
$ git stash pop /// 還原現(xiàn)場(chǎng)诬滩,并清除存儲(chǔ)棧中的內(nèi)容 /// $ git stash list /// 查看存儲(chǔ)棧中的工作現(xiàn)場(chǎng)列表 /// $ git stash apply ///只恢復(fù),不刪除棧 /// $ git stash drop /// 刪除棧存儲(chǔ)區(qū)
fetch 和 pull 的區(qū)別
-
$ git fetch origin develop
:只是拉取遠(yuǎn)程的develop分支的最新提交版本灭将,到本地的.git/refs/remotes
目錄【遠(yuǎn)程版本庫(kù)】中疼鸟,并沒(méi)有合并到本地分支,也就是本地分支仍然只有master
庙曙,沒(méi)有develop
.【本地版本庫(kù)目錄:.git/refs/heads
】 -
$ git pull origin develop
:相當(dāng)于:git fetch origin develop
+git merge develop
; 獲取遠(yuǎn)程develop分支空镜,并將其合并到當(dāng)前你所在的本地分支。
讓本地分支追溯到遠(yuǎn)程某個(gè)分支
如果發(fā)現(xiàn),自己創(chuàng)建的本地分支pull不了吴攒,那么张抄,可能是本地分支沒(méi)有與遠(yuǎn)程分支建立關(guān)聯(lián),這時(shí):
git branch --set-upstream-to=origin/<branch> develop
就可以建立連接洼怔,之后署惯,就是各種push、pull和merge了镣隶!
Pull 不下來(lái)怎么辦极谊?
- 如果發(fā)現(xiàn)是這種報(bào)錯(cuò):
fatal: refusing to merge unrelated histories
【在新建Ionic項(xiàng)目的時(shí)候經(jīng)常這樣】,那么矾缓,用這條語(yǔ)句來(lái)pull:git pull origin master --allow-unrelated-histories
git clone 指定目錄
如果我們不想每次先cd到那個(gè)目錄在進(jìn)行clone操作怀酷,那么,這句命令很有用:
git clone <git url> "C:\a\b"
其中:a
表示指定目錄嗜闻,b
表示你自定義的文件夾名蜕依,如:
>git clone https://github.com/androidjp/xxxxx.git "D:\aaa\bbb"
最終,會(huì)創(chuàng)建aaa\bbb
目錄和文件夾琉雳,然后在內(nèi)部拉取所有代碼样眠。
Lag標(biāo)簽
-
git tag <name>
:新建一個(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)簽甥桂。