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 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文件提交到遠端即可。
例如:

②,有的公司因為安全原因會封禁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---