git使用具体介绍
1.1. Git庫中由三部分組成?
?????? Git 倉庫就是那個.git 文件夾,當中存放的是我們所提交的文檔索引內容,Git 可基于文檔索引內容對其所管理的文檔進行內容追蹤,從而實現文檔的版本號控制。.git文件夾位于工作文件夾內。?
1) 工作文件夾:用戶本地的文件夾;?
2) Index(索引):將工作文件夾下全部文件(包括子文件夾)生成快照,存放到一個暫時的存儲區域,Git 稱該區域為索引。?
3) 倉庫:將索引通過commit命令提交至倉庫中,每一次提交都意味著版本號在進行一次更新。?
?
1.2. 使用Git時的初始化事項?
1.2.1. Git初始化配置?
1) 配置使用git倉庫的人員姓名?
?????? git config --global user.name "Your Name Comes Here"?
2) 配置使用git倉庫的人員email?
?????? git config --global user.email?you@yourdomain.example.com?
1.2.2. Git文檔忽略機制?
工作文件夾中有一些文件是不希望接受Git 管理的,譬如程序編譯時生成的中間文件等等。Git 提供了文檔忽略機制,能夠將工作文件夾中不希望接受Git 管理的文檔信息寫到同一文件夾下的.gitignore 文件里。?
比如:工作文件夾下有個zh文件夾,假設不想把它增加到Git管理中,則運行:?
?????? echo “zh” > .gitignore?
?????? git add .?
有關gitignore 文件的諸多細節知識可閱讀其使用手冊:man gitignore?
1.3. Git與Repo的比較?
?????? Git操作一般相應一個倉庫,而Repo操作一般相應一個項目,即一個項目會由若干倉庫組成。?
比如,在操作整個Recket項目時使用Repo,而操作當中的某個倉庫時使用Git。在包括隱藏文件夾.git的文件夾下運行git操作。
2. Git help?
?????? Git help 獲取git基本命令?
(假設要知道某個特定命令的用法,比如:使用Git help clone,來獲取git clone的用法)
3. Git本地操作基本命令?
3.1. Git init?
或者使用git init-db。?
創建一個空的Git庫。在當前文件夾中產生一個.git 的子文件夾。以后,全部的文件變化信息都會保存到這個文件夾下,而不像CVS那樣,會在每一個文件夾和子文件夾下都創建一個CVS文件夾。?
在.git文件夾下有一個config文件,能夠改動當中的配置信息。?
3.2. Git add?
將當前工作文件夾中更改或者新增的文件增加到Git的索引中,增加到Git的索引中就表示記入了版本號歷史中,這也是提交之前所須要運行的一步。?
能夠遞歸加入,即假設后面跟的是一個文件夾作為參數,則會遞歸加入整個文件夾中的全部子文件夾和文件。比如:?
?????? git add dir1 ( 加入dir1這個文件夾,文件夾下的全部文件都被加入 )?
?????? Git add f1 f2 ( 加入f1,f2文件)?
?????? git add .????? ( 加入當前文件夾下的全部文件和子文件夾 )?
3.3. Git rm?
從當前的工作文件夾中和索引中刪除文件。?
能夠遞歸刪除,即假設后面跟的是一個文件夾做為參數,則會遞歸刪除整個文件夾中的全部子文件夾和文件。比如:?
?????? git rm –r * (進入某個文件夾中,運行此語句,會刪除該文件夾下的全部文件和子文件夾)?
?????? git rm f1??? (刪除文件f1,包括本地文件夾和index中的此文件記錄)?
?????? git rm --ached f1 (刪除文件f1,不會刪除本地文件夾文件,僅僅刪除index中的文件記錄;將已經git add的文件remove到cache中,這樣commit的時候不會提交這個文件, 適用于一下子加入了非常多文件, 卻又想排除當中個別幾個文件的情況.)?
3.4. Git commit?
提交當前工作文件夾的改動內容。?
直接調用git commit命令,會提示填寫凝視。通過例如以下方式在命令行就填寫提交凝視:git commit -m "Initial commit of gittutor reposistory"。 注意,和CVS不同,git的提交凝視必須不能為空,否則就會提交失敗。?
?????? git commit另一個 -a的參數,能夠將那些沒有通過git add標識的變化一并強行提交,可是不建議使用這樣的方式。?
每一次提交,git就會為全局代碼建立一個唯一的commit標識代碼,用戶能夠通過git reset命令恢復到隨意一次提交時的代碼。?
?????? git commit –-amend –m “message” (在一個commit id上不斷改動提交的內容)?
3.5. Git status?
查看版本號庫的狀態。能夠得知哪些文件發生了變化,哪些文件還沒有加入到git庫中等等。 建議每次commit前都要通過該命令確認庫狀態。?
最常見的誤操作是, 改動了一個文件, 沒有調用git add通知git庫該文件已經發生了變化就直接調用commit操作, 從而導致該文件并沒有真正的提交。這時假設開發人員以為已經提交了該文件,就繼續改動甚至刪除這個文件,那么改動的內容就沒有通過版本號管理起來。假設每次在 提交前,使用git status查看一下,就能夠發現這樣的錯誤。因此,假設調用了git status命令,一定要格外注意那些提示為 “Changed but not updated:”的文件。 這些文件都是與上次commit相比發生了變化,可是卻沒有通過git add標識的文件。?
3.6. Git log?
查看歷史日志,包括每次的版本號變化。每次版本號變化相應一個commit id。?
?????? Git log -1?
?????? -1的意思是僅僅顯示一個commit,假設想顯示5個,就-5。不指定的話,git log會從該commit一直往后顯示。?
?????? Git log --stat –summary (顯示每次版本號的具體變化)?
在項目日志信息中,每條日志的首行(就是那一串字符)為版本號更新提交所進行的命名,我們能夠將該命名理解為項目版本號號。項目版本號號應該是唯一的,默認由 Git 自己主動生成,用以標示項目的某一次更新。假設我們將項目版本號號用作git-show 命令的參數,就可以查看該次項目版本號的更新細節。比如:?
1) Git log?
?
2)Git show?
?
實際上,上述命令并不是是真正的進行版本號號自己定義,僅僅是制造了一個tag對象而已,這在進行項目版本號對外公布時比較實用。?
3.7. Git merge?
把server上下載下來的代碼和本地代碼合并。或者進行分支合并。?
比如:當前在master分支上,若想將分支dev上的合并到master上,則git merge dev?
注意:git merge nov/eclair_eocket (是將servergit庫的eclair_eocket分支合并到本地分支上)?
?????? git rebase nov/eclair_eocket (是將servergit庫的eclair_eocket分支映射到本地的一個暫時分支上,然后將本地分支上的變化合并到這個暫時分支,然后再用這個暫時分支初始化本地分支)?
3.8. Git diff?
把本地的代碼和index中的代碼進行比較,或者是把index中的代碼和本地倉庫中的代碼進行比較。?
1) Git diff?
比較工作文件夾和Index中的代碼。?
2) Git diff - - cached?
比較index和本地倉庫中的代碼。?
3.9. Git checkout?
3.9.1. 切換到分支?
1) 創建一個新分支,并切換到該分支上?
?????? Git checkout –b 新分支名?
2)切換到某個已經建立的本地分支local_branch?
?????? Git checkout local_branch?
(使用cat .git/HEAD后,顯示refs:refs/heads/ local_branch)?
3) 切換到server上的某個分支remote_branch?
?????? Git checkout remote_branch?
(遠程分支remote_branch能夠通過 git branch –r 列出)?
4) 切換到某個commit id?
?????? Git checkout commit_id?
(使用cat .git/HEAD后,顯示commit_id)?
5) 切換到某個tag?
?????? Git checkout tag?
(使用cat .git/HEAD后,顯示tag)?
注意: 除了1)和2)外,其余三種都僅僅是切換到了一個暫時的( no branch )狀態 (this head is detached),這時用 git branch 能夠看到處于(no branch)上, cat .git/HEAD 看到指向對應的commit id。 這個(no branch)僅僅是暫時存在的,并非一個真正建立的branch。 假設此時運行2),則這個(no branch)就自己主動消失了;假設運行1), 則創建新分支 new branch,并把這個(no branch)掛到這個新分支上,此時cat .git/refs/heads/new_branch 能夠看到已經指向了剛才那個commit id。?
3.9.2. 用已有分支初始化新分支?
運行以下的命令,在切換到某個已經建立的local branch或者某個remote branch或者某個commit id 或者某個tag的同一時候,創建新分支new_branch,而且掛到這個新分支上。?
1) 切換到某個已經建立的本地分支local_branch,而且使用此分支初始化一個新分支new_branch。?
?????? git checkout –b new_branch local_branch?
2) 切換到某個遠程分支remote_branch,而且用此分支初始化一個新分支new_branch。?
?????? Git checkout –b new_branch remote_branch?
3) 切換到某個commit id,并建立新分支new_branch?
?????? Git checkout –b new_branch commit_id?
4) 切換到某個tag,并建立新分支new_branch?
?????? Git checkout –b new_branch tag?
3.9.3. 還原代碼?
比如 “git checkout app/model/user.rb” 就會將user.rb文件從上一個已提交的版本號中更新回來,未提交的工作文件夾中的內容所有會被覆蓋。
3.10. Git-ls-files?
查看當前的git庫中有那些文件。?
3.11. Git mv?
重命名一個文件、文件夾或者鏈接。?
比如:Git mv helloworld.c helloworld1.c (把文件helloworld.c 重命名為 helloworld1.c)?
3.12. Git branch?
3.12.1. 總述?
在 git 版本號庫中創建分支的成本差點兒為零,所以,不必吝嗇多創建幾個分支。當第一次運行git init時,系統就會創建一個名為“master”的分支。 而其他分支則通過手工創建。?
以下列舉一些常見的分支策略:?
創建一個屬于自己的個人工作分支,以避免對主分支 master 造成太多的干擾,也方便與他人交流協作;?
當進行高風險的工作時,創建一個試驗性的分支;?
合并別人的工作的時候,最好是創建一個暫時的分支用來合并,合并完畢后再“fetch”到自己的分支。?
對分支進行增、刪、查等操作。?
注意:分支信息一般在.git/refs/文件夾下,當中heads文件夾下為本地分支,remotes為相應server上的分支,tags為標簽。?
3.12.2. 查看分支?
?????? git branch 列出本地git庫中的全部分支。在列出的分支中,若分支名前有*,則表示此分支為當前分支。?
?????? git branch –r 列出servergit庫的全部分支。?
(能夠繼續使用命令 “ git checkout -b 本地分支名 server分支名”來獲取server上某個分支的代碼文件)。?
3.12.3. 查看當前在哪個分支上?
?????? cat .git/HEAD?
3.12.4. 創建一個分支?
1) git branch 分支名?
盡管創建了分支,可是不會將當前工作分支切換到新創建的分支上,因此,還須要命令“git checkout 分支名” 來切換,?
2) git checout –b 分支名?
不但創建了分支,還將當前工作分支切換到了該分支上。?
3.12.5. 切換到某個分支:git checkout 分支名?
切換到主分支:git checkout master?
3.12.6. 刪除分支?
?????? git branch –D 分支名?
注意: 刪除后,發生在該分支的全部變化都無法恢復。強制刪除此分支。?
3.12.7. 比較兩個分支上的文件的差別?
?????? git diff master 分支名 (比較主分支和還有一個分支的差別)?
3.12.8. 查看分支歷史?
?????? git-show-branch (查看當前分支的提交凝視及信息)?
?????? git-show-branch -all(查看全部分支的提交凝視及信息)比如:?
* [dev] d2?
! [master] m2?
--?
* [dev] d2?
* [dev^] d1?
* [dev~2] d0?
*+ [master] m2?
在上述樣例中, “--”之上的兩行表示有兩個分支dev和master, 且dev分支上最后一次提交的日志是“d2”,master分支上最后一次提交的日志是 “m2”。 “--”之下的幾行表示了分支演化的歷史,當中 dev表示發生在dev分支上的最后一次提交,dev^表示發生在dev分支上的倒數第二次提交。dev~2表示發生在dev分支上的倒數第三次提交。?
3.12.9. 查看當前分支的操作記錄?
?????? git whatchanged?
3.12.10. 合并分支?
法一:?
?????? git merge “凝視” 合并的目標分支 合并的來源分支?
假設合并有沖突,git會有提示。?
比如:git checkout master?? (切換到master分支)?
?????? git merge HEAD dev~2 (合并master分支和dev~2分支)或者:git merge master dev~2?
法二:?
?????? git pull 合并的目標分支 合并的來源分支?
比如: git checkout master (切換到master分支)?
?????? git pull . dev~2(合并當前分支和dev~2分支)?
3.13. Git rebase?
一般在將server最新內容合并到本地時使用,比如:在版本號C時從server上獲取內容到本地,改動了本地內容,此時想把本地改動的內容提交到server上;但發現server上的版本號已經變為G了,此時就須要先運行Git rebase,將server上的最新版本號合并到本地。比如:?
用以下兩幅圖解釋會比較清楚一些,rebase命令運行后,實際上是將分支點從C移到了G,這樣分支也就具有了從C到G的功能。?
?
3.14. Git reset?
庫的逆轉與恢復除了用來進行一些廢棄的研發代碼的重置外,另一個關鍵的數據。比方我們從遠程clone了一個代碼庫,在本地開發后,準備提交回遠程。可是本地代碼庫在開發時,有功能性的commit,也有出于備份目的的commit等等。總之,commit的日志中有大量無用log,我們并不想把這些 log在提交回遠程時也提交到庫中。 因此,就要用到git reset。?
?????? git reset的概念比較復雜。它的命令形式:git reset [--mixed | --soft | --hard] [<commit-ish>]?
命令的選項:?
?????? --mixed 這個是默認的選項。如git reset [--mixed] dev^(dev^的定義能夠參見2.6.5)。它的作用僅是重置分支狀態到dev1^, 可是卻不改變不論什么工作文件的內容。即,從dev1^到dev1的全部文件變化都保留了,可是dev1^到dev1之間的全部commit日志都被清除了, 并且,發生變化的文件內容也沒有通過git add標識,假設您要又一次commit,還須要對變化的文件做一次git add。 這樣,commit后,就得到了一份很干凈的提交記錄。 (回退了index和倉庫中的內容)?
?????? --soft相當于做了git reset –mixed,后,又對變化的文件做了git add。假設用了該選項, 就能夠直接commit了。(回退了倉庫中的內容)?
?????? --hard這個命令就會導致全部信息的回退, 包含文件內容。 一般僅僅有在重置廢棄代碼時,才用它。 運行后,文件內容也無法恢復回來了。(回退了工作文件夾、index和倉庫中的內容)?
比如:?
切換到使用的分支上;?
?????? git reset HEAD^ 回退第一個記錄?
?????? git reset HEAD~2 回退第二個記錄?
假設想把工作文件夾下的文件也回退,則使用git reset - - hard HEAD^ 回退第一個記錄?
?????? git reset - - hard HEAD~2 回退第二個記錄?
還能夠使用例如以下方法:?
將當前的工作文件夾全然回滾到指定的版本號號,如果例如以下圖,我們有A-G五次提交的版本號,當中C的版本號號是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們運行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么結果就僅僅剩下了A-C三個提交的版本號?
?
3.15. Git revert?
還原某次對版本號的改動,比如:git revert commit_id (當中commit_id為commit代碼時生成的一個唯一表示的字符串)?
比如:(3.6中)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (運行此操作,則還原上一次commit的操作)?
3.16. Git config?
利用這個命令能夠新增、更改Git的各種設置,比如 “git config branch.master.remote origin” 就將master的遠程版本號庫設置為別名叫做origin版本號庫。?
3.17. Git show?
顯示對象的不同類型。?
3.18. Git tag?
創建、列出、刪除或者驗證一個標簽對象(使用GPG簽名的)。?
能夠將某個詳細的版本號打上一個標簽,這樣就不須要記憶復雜的版本號號哈希值字符串了,比如你能夠使用 “git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 來標記這個被你還原的版本號,那么以后你想查看該版本號時,就能夠使用 revert_version標簽名,而不是哈希值了。
4. Gitserver操作命令(與server交互)?
4.1. Git clone?
取出server的倉庫的代碼到本地建立的文件夾中(與server交互)?
通過git clone獲取遠端git庫后,.git/config中的開發人員信息不會被一起clone過來。仍然須要為本地庫的.git/config文件加入開發人員信息。此外,開發人員還須要自己加入?? . gitignore文件。?
通過git clone獲取的遠端git庫,僅僅包括了遠端git庫的當前工作分支。假設想獲取其他分支信息,須要使用 “git branch –r” 來查看, 假設須要將遠程的其他分支代碼也獲取過來,能夠使用命令 “ git checkout -b 本地分支名 遠程分支名”,當中,遠程分支名為 “git branch –r” 所列出的分支名, 通常是諸如“origin/分支名”的樣子。假設本地分支名已經存在, 則不須要“-b”參數。?
比如:?
?
4.2. Git pull?
從server的倉庫中獲代替碼,和本地代碼合并。(與server交互,從server上下載最新代碼,等同于: Git fetch + Git merge)?
從其他的版本號庫(既能夠是遠程的也能夠是本地的)將代碼更新到本地,比如:“git pull origin master ”就是將origin這個版本號庫的代碼更新到本地的master主分支。?
?????? git pull能夠從隨意一個git庫獲取某個分支的內容。使用方法例如以下:?
git pull?username@ipaddr:遠端repository名遠端分支名?本地分支名。這條命令將從遠端git庫的遠端分支名獲取到本地git庫的一個本地分支中。當中,假設不寫本地分支名,則默認pull到本地當前分支。?
須要注意的是,git pull也能夠用來合并分支。 和git merge的作用同樣。 因此,假設你的本地分支已經有內容,則git pull會合并這些文件,假設有沖突會報警。?
比如:?
?
4.3. Git push?
將本地commit的代碼更新到遠程版本號庫中,比如 “git push origin”就會將本地的代碼更新到名為orgin的遠程版本號庫中。?
?????? git push和git pull正好想反,是將本地某個分支的內容提交到遠端某個分支上。使用方法:?git pushusername@ipaddr:遠端repository名本地分支名?遠端分支名。這條命令將本地git庫的一個本地分支push到遠端git庫的遠端分支名中。?
須要格外注意的是,git push好像不會自己主動合并文件。因此,假設git push時,發生了沖突,就會被后push的文件內容強行覆蓋,并且沒有什么提示。 這在合作開發時是非常危急的事情。?
比如:?
?
4.4. Git fetch?
從server的倉庫中下載代碼。(與server交互,從server上下載最新代碼)?
相當于從遠程獲取最新版本號到本地,不會自己主動merge,比Git pull更安全些。?
使用此方法來獲取server上的更新。?
比如:假設使用git checkout nov/eclair_rocket (nov/eclair_rocket為server上的分支名),則是獲取上次使用git fetch命令時從server上下載的代碼;假設先使用 git fetch ,再使用git checkout nov/eclair_rocket,則是先從server上獲取最新的更新信息,然后從server上下載最新的代碼。
轉載于:https://www.cnblogs.com/mengfanrong/p/3764532.html
總結
- 上一篇: 软件课体会
- 下一篇: 技术人生:我喜欢年纪不断变大