分布式版本控制系統(tǒng)( Distributed Version Control System,簡稱 DVCS )
面向需求筆記,只看近期工作可能要用到的內(nèi)容
創(chuàng)建版本庫
新建目錄,git init把當前目錄變成git可以管理的倉庫在版本庫目錄下文件添加到倉庫:git add(add 可以多次頻繁使用,全部添加完之后commit)
把文件提交到倉庫: git commit -m '...'
$ git log <last release> HEAD --grep feature 僅僅顯示本次發(fā)布新增加的功能。修改文件之后
查看git狀態(tài):git status
顯示被修改了還沒有提交查看修改了什么: git diff
查看修改記錄: git log --pretty=onelint
后面的參數(shù)是整理輸出格式的回退
git reset --hard HEAD^
HEAD^表示上一版本
HEAD^^
HEAD~100工作區(qū),暫存區(qū)
工作區(qū),電腦里可以看到的目錄
版本庫(repository),工作區(qū)里有一個隱藏目錄.git, 這個不算工作區(qū),而是git版本庫,版本庫里有很多東西,包括暫存區(qū),還有g(shù)it自動創(chuàng)建的第一個分支master,和一個指向master的指針HEAD撤銷操作
git status
On branch master
Changes not staged for commit:
//還沒有add
git status
On branch master
Changes to be committed:
//還沒有commit
總而言之:
場景1:當你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時,用命令git checkout -- filename。(可以把文件在工作區(qū)的修改全部撤銷)
場景2:當你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改,分兩步,第一步用命令git reset HEAD file(把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)),就回到了場景1,第二步按場景1操作。
場景3:已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節(jié),不過前提是沒有推送到遠程庫。
刪除文件
先在工作區(qū)rm
這時候git status會顯示有文件被刪除
如果確實要刪除,git rm filename, git commit
如果不想刪了,git checkout -- filenamecheckout
版本庫里代碼替換工作區(qū)版本,“一鍵還原”遠程倉庫
找一臺電腦充當服務(wù)器,其他人都從這里clone代碼到自己電腦,也提交到這個服務(wù)器
github sshkeyssh key(每臺電腦對應(yīng)一個)
創(chuàng)建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,如果已經(jīng)有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創(chuàng)建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認值即可,由于這個Key也不是用于軍事目的,所以也無需設(shè)置密碼。
(如果一切順利的話,可以在用戶主目錄里找到.ssh
目錄,里面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。)在github中添加sshkey
branch(重點?。?!)
創(chuàng)建并切換到分支:git checkout -b dev
查看當前分支:git branch/git status
切換回master:git checkout master
把dev合并到master(merge:合并指定分支到當前分支,古跟我說的是master合并到branch):git merge dev
刪除分支: git branch -d <name>conflict
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
//查看分支合并情況
$ git log --graph --pretty=oneline --abbrev-commit
如果工作只進行到一半,還沒法提交,預(yù)計完成還需1天時間。但是,必須在兩個小時內(nèi)修復(fù)該bug,怎么辦?
幸好,Git還提供了一個stash
功能,可以把當前工作現(xiàn)場“儲藏”起來,等以后恢復(fù)現(xiàn)場后繼續(xù)工作:
$ git stash
多人協(xié)作
//查看遠程庫信息
git remote
git remote -v
//推送分支,把本地提交到遠程庫
git push origin master
提交有沖突,先pull把新提交的抓下來,在本地合并解決后再推送
多人協(xié)作的工作模式通常是這樣:
首先,可以試圖用git push origin branch-name推送自己的修改;
如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull試圖合并;
如果合并有沖突,則解決沖突,并在本地提交;
沒有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream branch-name origin/branch-name。
這就是多人協(xié)作的工作模式,一旦熟悉了,就非常簡單。
實際情況:
本地master被污染,從本地的master上checkout的branch 也是被污染的,想修正
解決方法:
(當前所在位置是branch1)
- 刪掉本地master: git branck -D master
- pull遠程master: git pull origin master
(pull會把所有master和所有branch都拿下來,而且不會改變當前所在位置)
到這里其實可以把現(xiàn)在branch和剛pull下來的master比較就完事了,但是我想新建分支并把之前分支廢棄
- 進入master分支: git checkout master
- 新建分支:git checkout -b branck2
- 可以git branch 確保自己在branch2
- 把先前分支branch1中做的修改merge到branch2中:git merge branch1
- git diff master 檢查遠程master和修改后要push文件是否都正確