
拉取遠(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倉庫/XXX結(jié)合使用。$ git clone https://git.oschina.net/androidJP/Demo.git ///項(xiàng)目的默認(rèn)分支被克隆下來了 $ git branch /// 輸出:如master 等已經(jīng)拉取到的分支名和當(dāng)前分支 $ git fetch $ git checkout -b develop origin/develop /// 拉取遠(yuǎn)程的develop分支并本地切換到了develop分支
本地分支pull不了
原因:你的本地分支沒有關(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)程倉庫)
$ git push -u origin branchA
版本回滾和還原
- 回滾
- 法一:通過
git log查看版本號(hào),然后通過版本號(hào)來定位HEAD應(yīng)該指向哪里。$ git log --pretty=oneline $ git reset --hard 12345 - 法二:通過
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),并通過git reflog來獲取以前的git操作記錄,從而得到對(duì)應(yīng)的版本號(hào)。
$ git reflog
$ git reset --hard 12345
不小心寫了句“老板真欠扁”,怎么辦?
- 如果你已經(jīng)commit了
恭喜你,只能用版本回滾了。(如果老板沒有你最新提交版本的版本號(hào)的話) - 幸好,我的文件還在工作區(qū),沒有被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 公約私鑰生成
///在你的用戶主目錄下的 .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- 自己用編輯器打開文件進(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)程倉庫
- 創(chuàng)建
$ git remote add origin git@github.com:michaelliao/learngit.git - 推送
/// 第一次推送,-u 作用是將本地倉庫與遠(yuǎn)程倉庫origin 綁定 $ git push -u origin master /// 以后的推送,則不需要再次綁定了 $ git push origin master - 查看遠(yuǎn)程庫信息
$ git remote /// 遠(yuǎn)程庫名 $ git remote -v ///詳細(xì)信息 - 查看遠(yuǎn)程分支
$ git branch -a ///查看所有分支(包括本地和遠(yuǎn)程倉庫) $ 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的修改先保存起來,然后切換到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)程版本庫】中,并沒有合并到本地分支,也就是本地分支仍然只有master,沒有develop.【本地版本庫目錄:.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不了,那么,可能是本地分支沒有與遠(yuǎn)程分支建立關(guān)聯(lián),這時(shí):
git branch --set-upstream-to=origin/<branch> develop
就可以建立連接,之后,就是各種push、pull和merge了!
Pull 不下來怎么辦?
- 如果發(fā)現(xiàn)是這種報(bào)錯(cuò):
fatal: refusing to merge unrelated histories【在新建Ionic項(xiàng)目的時(shí)候經(jīng)常這樣】,那么,用這條語句來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:可以推送全部未推送過的本地標(biāo)簽; -
git tag -d <tagname>:可以刪除一個(gè)本地標(biāo)簽; -
git push origin :refs/tags/<tagname>:可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。
