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。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,如果已經(jīng)有了,可直接跳到下一步。如果沒有,打開Git Bash),創(chuàng)建SSH Key:

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

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

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

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

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

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

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

常用命令


git常用命令流程圖


git clone ?[url] ?#從遠端下載一個項目。

git fetch ?#下載遠程倉庫的所有變動更新。

git pull ?#下載遠程倉庫的所有變動更新并與本地分支合并 ,相當于git fetch 后 再 git merge。

---2017-08-16補充 begin---

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

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

本地master以及遠端master如下圖:


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


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


pony 先于love首先把自己的修改push到了遠程倉庫,遠程倉庫origin/master指針指向了T1。


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


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

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


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

然后love 也git push 到了遠端庫


love 的本地庫


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

例如:git rebase -i fc2abeb55542b9c2e445af28bfe4c91be0eb6735?

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

接著上面,比如,

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

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

這時,我們一般會使用cherry-pick 。

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

注:這個新提交的commit和原來的commit的哈希值不同,是一個新的值。但標識名相同。

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

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

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

---2017-08-16補充 end---

git checkout ?[branchName] # 切換到指定分支,并更新workspace。如果這里的branchName是遠端有但是本地沒有的分支,會直接本地檢出這個分支并更新。等同于 git checkout -b [branchName] origin/[branchName]。

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

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

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

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

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



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

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

git stash clear #清空暫存棧。

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

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

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

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

git push origin [branchName]:[branchName] #推送當前分支到遠程倉庫的對應(yīng)分支

git ?push ?--force #強推當前分支到遠程倉庫,即便有沖突。

git push --all # 推送所有分支到遠程倉庫

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

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

---2017-08-16補充 begin---

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

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

git branch -d <branchName> ?#刪除某個分支

git branch -D <branchName> ?#強制刪除某個分支

git merge ?<branchName> #合并某個分支到當前分支

git merge --abort ?#merge過程中終止這次merge?

---2017-08-16補充 end---

---2017-08-15補充 begin---:

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

例如:


.gitignore

②,有的公司因為安全原因會封禁ssh端口,這時我們pull或者push代碼就會采用http的方式。但是http每次push都需要輸入用戶名和密碼;

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

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

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

---2017-08-15補充 end---

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容