windows下git的使用

1,https://git-for-windows.github.io/ 下載windows 版 git

2,安裝完成后,還需要最后一步設(shè)置,在命令行輸入:

$ git config --global user.name "loveqin"

$ git config --global user.email “l(fā)oveqin@xx.com”

3,創(chuàng)建SSH Key。在用戶主目錄下,看看有沒(méi)有.ssh目錄,如果有,再看看這個(gè)目錄下有沒(méi)有id_rsa和id_rsa.pub這兩個(gè)文件,如果已經(jīng)有了,可直接跳到下一步。如果沒(méi)有,打開(kāi)Git Bash),創(chuàng)建SSH Key:

$ ssh-keygen -t rsa -C “l(fā)oveqin@xx.com”

4,你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認(rèn)值即可,由于這個(gè)Key也不是用于軍事目的,所以也無(wú)需設(shè)置密碼。

如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個(gè)文件,這兩個(gè)就是SSH Key的秘鑰對(duì),id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

5,登陸github或者公司gitlab(source.xx.com),點(diǎn)擊用戶名到用戶主頁(yè),點(diǎn)擊個(gè)人設(shè)置,點(diǎn)擊添加按鈕,輸入key的名稱。

6,到根目錄下,找到id_rsa.pub文件,粘貼里面的內(nèi)容到上一步里的公鑰處。

7,找到自己的庫(kù),點(diǎn)擊ssh地址,然后復(fù)制。

8,gitbash 里 進(jìn)入到自己的要放置項(xiàng)目的文件夾,運(yùn)行g(shù)it clone 剛剛復(fù)制的ssh的地址即可。

常用命令


git常用命令流程圖


git clone ?[url] ?#從遠(yuǎn)端下載一個(gè)項(xiàng)目。

git fetch ?#下載遠(yuǎn)程倉(cāng)庫(kù)的所有變動(dòng)更新。

git pull ?#下載遠(yuǎn)程倉(cāng)庫(kù)的所有變動(dòng)更新并與本地分支合并 ,相當(dāng)于git fetch 后 再 git merge。

---2017-08-16補(bǔ)充 begin---

注:這里重點(diǎn)說(shuō)下。git fetch 后再git merge 會(huì)發(fā)生什么?這里涉及到一會(huì)兒我們要補(bǔ)充git rebase.

假設(shè)有2個(gè)developer love 和 pony 同時(shí)開(kāi)發(fā)一個(gè)項(xiàng)目。各自從遠(yuǎn)端庫(kù)拉取了一份代碼,并且直接在master分支上開(kāi)發(fā)。

本地master以及遠(yuǎn)端master如下圖:


然后love 在自己的分支上進(jìn)行了開(kāi)發(fā)更新了代碼并且commit到了暫存區(qū)(J1)。


pony也在自己的分支上進(jìn)行了開(kāi)發(fā)并且commit到了暫存區(qū)(T1)。


pony 先于love首先把自己的修改push到了遠(yuǎn)程倉(cāng)庫(kù),遠(yuǎn)程倉(cāng)庫(kù)origin/master指針指向了T1。


現(xiàn)在love也想把自己的提交push到遠(yuǎn)程,運(yùn)行g(shù)it push ,失敗了。因?yàn)檫h(yuǎn)端庫(kù)已經(jīng)更新了。然后love 運(yùn)行了下git fetch ,把遠(yuǎn)端庫(kù)的更新拉取到了自己的本地倉(cāng)庫(kù)。


如上圖所以,love的本地倉(cāng)庫(kù)發(fā)生了分歧,有從遠(yuǎn)端庫(kù)fetch過(guò)來(lái)的T1,同時(shí)也有自己本地的commit J1。這時(shí)怎么解決?想要把pony提交的T1合并到自己的倉(cāng)庫(kù)中來(lái),可以使用git merge ,這個(gè)merge即包含了pony的T1,也包含了 love的 J1,但是加上之前的一次commit,會(huì)有2次commit,review的時(shí)候要比較2次,比較麻煩。并且git log里多了一次無(wú)意義的commit歷史。(這前面說(shuō)的,git fetch+git merge ,其實(shí)就是我們常用的git pull 幫我們做的事情)。

為了保證git commit 歷史的線性和干凈。我們可以采用另一種方式,git rebase。如果love在git fetch之后,沒(méi)有用git merge,而是用了git rebase改變 J1的history,如下圖:


rebase之后 J1 變成了J1`,其實(shí)還是剛剛的J1,只是commit 的history變了,J1的commit 碼都沒(méi)變(這其實(shí)就是git pull --rebase)。

然后love 也git push 到了遠(yuǎn)端庫(kù)


love 的本地庫(kù)


git rebase-i <commit-id>,合并或者commit提交歷史。也就是可以取git log里的commit的某一些版本合并到一起。這個(gè)一般會(huì)跟接下來(lái)要說(shuō)的 git cherry-pick有關(guān)系。

例如:git rebase -i fc2abeb55542b9c2e445af28bfe4c91be0eb6735?

這條命令會(huì)從fc2abeb55542這個(gè)commit id 開(kāi)始合并你想合并的commit成一個(gè)commit。這時(shí)要vim修改想要合并的commit 的pick 為s ,并且要留下一個(gè)commit id,將來(lái)會(huì)以這個(gè)commit id為基準(zhǔn),把改成s的commit提交合并到這個(gè)留下的commmit id里,產(chǎn)生一個(gè)新的commit記錄,這個(gè)記錄包括了所有的你想合并的commit。這樣在其他分支里cherry-pick的時(shí)候,只需要cherry-pick這一個(gè)合并了的commit即可。

接著上面,比如,

①,你在開(kāi)發(fā)完成提測(cè)后,QA測(cè)試的時(shí)候,fix了很多問(wèn)題,有多次commit。但是事實(shí)上,大多數(shù)項(xiàng)目比較龐大或者多人同步開(kāi)發(fā)的時(shí)候,可能dev分支(test環(huán)境的分支)跟master并不同步,并且可能已經(jīng)分開(kāi)很久了。你開(kāi)發(fā)的時(shí)候,并沒(méi)有從master拉取分支來(lái)開(kāi)發(fā),是從dev分支開(kāi)發(fā)的。所以可能沒(méi)法直接把當(dāng)前分支merge到master(生產(chǎn)環(huán)境分支)。

②,你這次開(kāi)發(fā)了很多功能, 同樣有很多commit ,但是這些確是要分批發(fā)布生產(chǎn)環(huán)境的,也就是說(shuō),有一些提交是不能merge到master(生產(chǎn)環(huán)境)的。

這時(shí),我們一般會(huì)使用cherry-pick 。

git cherry-pick <commit-id>,可以檢出某分支上的一次或多次commit應(yīng)用到當(dāng)前分支(類似再次提交) 。

注:這個(gè)新提交的commit和原來(lái)的commit的哈希值不同,是一個(gè)新的值。但標(biāo)識(shí)名相同。

我們?cè)谑褂胏herry-pick的時(shí)候,會(huì)發(fā)現(xiàn)如果像上面第①種情況還是第②種情況,我們都要cherry-pick 好多次,這特別麻煩,所以我們一般在處理這2種情況的時(shí)候需要用git rebase-i ,先把我們需要cherry-pick的所有commits記錄合并成1條commit記錄,然后我們cherry-pick一次即可大功告成。

在cherry-pick的時(shí)候,可能會(huì)有沖突,如果有沖突的話,git status 看到當(dāng)前狀態(tài)會(huì)是cherry-picking ,這時(shí)我們要去有沖突的地方解決沖突,然后保存,然后記得git add 這個(gè)新保存的文件到暫存區(qū),再接著git cherry-pick --continue ,繼續(xù)cherry-pick 到 success。

當(dāng)然,如果你在cherry-pick過(guò)程中,發(fā)現(xiàn)有問(wèn)題,想終止cherry-pick,可以用git cherry-pick --abort 來(lái)終止。?

---2017-08-16補(bǔ)充 end---

git checkout ?[branchName] # 切換到指定分支,并更新workspace。如果這里的branchName是遠(yuǎn)端有但是本地沒(méi)有的分支,會(huì)直接本地檢出這個(gè)分支并更新。等同于 git checkout -b [branchName] origin/[branchName]。

git checkout -b [branchName] ?#新建一個(gè)分支,并且切換到該分支。

git add [file1] ?[file2] ? ?#添加指定文件到暫存區(qū)。

git add .或者 git add * #添加當(dāng)前目錄的所有文件到暫存區(qū)

git stash # 將工作區(qū)做的修改暫存到一個(gè)git棧中

git stash list # 查看棧中暫存列表如下圖



git stash apply 暫存編號(hào)(stash@{1}) #恢復(fù)對(duì)應(yīng)編號(hào)暫存到工作區(qū)。但是這次暫存還存在棧中。

git stash pop # 將棧頂?shù)臅捍婊謴?fù)到工作區(qū),并從棧中去除。

git stash clear #清空暫存棧。

git commit -m "msg" #將暫存區(qū)提交到倉(cāng)庫(kù)。

git diff ?#顯示暫存區(qū)和工作區(qū)的差異。

git diff HEAD #顯示工作區(qū)與當(dāng)前分支最新commit之間的差異。

git diff commit-log commit-log ?#顯示兩次commit的差異。

git push origin [branchName]:[branchName] #推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù)的對(duì)應(yīng)分支

git ?push ?--force #強(qiáng)推當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù),即便有沖突。

git push --all # 推送所有分支到遠(yuǎn)程倉(cāng)庫(kù)

git checkout [filename] #檢出遠(yuǎn)端某個(gè)文件,相當(dāng)于撤銷了你本地工作區(qū)這個(gè)文件的修改。

只寫了一些工作中最常用到的,git 命令蠻多的,之后會(huì)有補(bǔ)充。

---2017-08-16補(bǔ)充 begin---

git branch ?#查看本地所有分支list

git branch -a #查看本地已經(jīng)遠(yuǎn)端所有分支list

git branch -d <branchName> ?#刪除某個(gè)分支

git branch -D <branchName> ?#強(qiáng)制刪除某個(gè)分支

git merge ?<branchName> #合并某個(gè)分支到當(dāng)前分支

git merge --abort ?#merge過(guò)程中終止這次merge?

---2017-08-16補(bǔ)充 end---

---2017-08-15補(bǔ)充 begin---:

①,如果git項(xiàng)目中有一些文件是不需要提交到遠(yuǎn)端的,(例如:ide的一些配置文件.idea/ .DS_Store? *.iml,前端開(kāi)發(fā)常node的包文件node_modules等等)可以在git項(xiàng)目根目錄新建一個(gè).gitignore文件提交到遠(yuǎn)端即可。

例如:


.gitignore

②,有的公司因?yàn)榘踩驎?huì)封禁ssh端口,這時(shí)我們pull或者push代碼就會(huì)采用http的方式。但是http每次push都需要輸入用戶名和密碼;

可以用 git config --global credential.helper cache ? #保存配置憑證(用戶名密碼)到緩存,默認(rèn)15分鐘后失效。

git config --global credential.helper 'cache --timeout=3600' # 保存配置憑證到緩存,1小時(shí)后失效。

$ git config credential.helper store? #保存配置憑證到硬盤 。這樣保存的密碼是明文的,保存在用戶主目錄下的git-credentials中,可以通過(guò)$ cat ~/.git-credentials 查看。

---2017-08-15補(bǔ)充 end---

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,583評(píng)論 1 26
  • git作為時(shí)下最流行的代碼管理工具,Git權(quán)威指南總結(jié)了十條喜歡Git的理由: 異地協(xié)同工作; 現(xiàn)場(chǎng)版本控制; 重...
    古斟布衣閱讀 1,847評(píng)論 0 12
  • 【1】馬春花與福康安 1991《雪山飛狐》劇照 一個(gè)美貌的鏢師的女兒行走在江湖上,未必會(huì)經(jīng)歷多少刀光劍影,但是一定...
    西湘閱讀 11,076評(píng)論 9 46
  • 她要離開(kāi)這個(gè)城市一段時(shí)間,需要退掉租的房子,于是要把東西暫放在他的房間。他把自己另一把門鑰匙給了她。第二天中午,她...
    炬焱閱讀 143評(píng)論 0 0
  • HUSH 作曲 : ???/??? 作詞 : ???/??? Through the endless daydre...
    嘰咕嘰咕guanguan閱讀 710評(píng)論 1 0