因爲九心同窗以前一直擔任獨立開發的職位,因此對於協做開發這塊兒的技能有所欠缺,對Git命令的使用還停留在獨立開發上,日常用的最多的三個命令也就:git
git clone
git commit
git push origin master
這不,在進入新的公司之後,狂補了一波Git命令,今天咱們就來聊一聊工做中的經常使用的Git命令。 web
在閱讀下文以前,推薦一個練習Git命令的網站(強力推薦):c#
以及一些學習網站:分佈式
《Git文檔》 《廖雪峯的Git教程》post
對於這個問題,咱們能夠看一下官方文檔:學習
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一個免費和開源的分佈式版本控制系統,致力於高效和快速的處理任何小或者大的項目。flex
瞭解Git中的工做區和版本庫很重要:動畫
.git
,這即是咱們所說的版本庫,其中,版本庫又分爲暫存區和分支。
git add
命令將文件從工做目錄提交到暫存區,
git commit
命令將文件從暫存區提交到git倉庫。
若是咱們想看一下工做區和暫存區文件的狀態,可使用命令 git status
,好比我最近學習的Flutter項目:網站
wangjiedeMacBook-Pro:flu_pro wangjie$ git status
warning: unable to access '/Users/wangjie/.config/git/attributes': Permission denied On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: lib/main.dart Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: lib/HelloWorld.dart Untracked files: (use "git add <file>..." to include in what will be committed) .metadata //... 省略 複製代碼
其中:
Changes to be committed
:暫存區的文件。
Changes not staged for commit
:工做區的文件,還未保存到暫存區。
Untracked files
:指那些第一次建立,尚未加入版本更新的文件。
在 Android Studio(下稱AS)中,更加方便: 裏面有不少顏色:
白色
:已commit,可是沒有發生變化的文件。
藍色
:commit以後發生了變化
原諒綠
:暫存區的文件。
黃色
:不須要進行版本控制的文件。
分支是多人協做開發中必不可少的角色,由於在咱們的開發過程當中,至少會有兩個分支:
除了這些分支,還可能有修復Bug的分支等。
具體命令: 添加所有文件
git add .
複製代碼
若是是添加某個文件
git add <文件路徑>
複製代碼
命令解釋: 將工做區的文件添加進暫存區。
IDEA或AS: 在IDEA或者AS中,在你進行Git初始化以後,當你添加新的文件時,會有這樣的提示: 也能夠這樣,右擊文件 > 選擇「Git」> 選擇「Add」和「Add to .gitignore」,分別對應着添加到暫存區和配置忽略文件:
加入到暫存區意味着該文件加入到版本控制中。配置到忽略文件則意味着不會加入到版本控制。
這種狀況可能會常常出現,你修改了某個文件的不少處代碼,可是卻不想挨個刪除,如上代碼就起做用了。
命令解釋 撤銷工做區的代碼修改。
具體命令
git checkout -- file
複製代碼
注意必定要加上--
,否則就會變成切換分支(下面會講)。
IDEA或者AS AS能夠很方便的查看某個文件修改了哪些代碼。步驟是:選擇下方「Version Control」> 選擇具體的文件 > 點擊 diff 有哪些差異一目瞭然,而且你能夠點擊對應的按鈕撤銷更改的代碼
一不當心把
git diff
要進行的操做給講了...
另一種狀況是改完代碼之後,若是使用了 git add
,將代碼提交到了暫存區,以前的命令就無論用了。
命令解釋 撤銷暫存區的代碼修改。
具體命令
git reset HEAD file
複製代碼
這個命令在AS或者IDEA下使用的場景很少
命令解釋 將暫存區的文件添加進版本庫
具體命令
git commit -m <提交描述信息>
複製代碼
動畫模型 輸入git commit以後,沙盒模型中發生了什麼?其實就是生成了一個新的版本記錄:
IDEA或者AS 我通常針對對應的需求,新建一個Change List,具體過程以下是:
選中「Version Control」 > 選擇某個 Change List > 右擊彈出選擇框 > 選擇「New Changelist」 如需 commit,選擇上圖「Commit」,輸入 Commit Message 便可
常見場景是你使用了 git commit
提交了代碼,可是還沒提交到遠程分支,隨後你很快發現了此次提交會帶來重大問題,因而你想撤銷此次提交。
命令解釋 在沒有上傳到遠程分支時,進行版本庫的撤銷。
具體命令
git reset HEAD~1
複製代碼
HEAD
表明當前的頭結點,HEAD~1
表明當前節點的前一個節點,後面解釋。
動畫模型
IDEA或者AS 在 AS 中,先打開到版本提交歷史 好比我想回退到
first commit
的那個版本 > 選中右擊 > 選擇【Reset Current Branch to Here...】,以後彈出一個彈出框 四個選項的區別:
git diff
查到文件發生了哪些變化),暫存區的提交記錄也會被保留。
人又不是機器,忘記本身改了哪些東西也是常有的事兒。
命令介紹 比較當前工做區和上一個版本的差別
在不輸入文件路徑的狀況下,默認比較的是當前工做區和上一個版本的區別,而且命令行會告訴你什麼類的變化是什麼樣的。內容我就不羅列了。
IDEA或者AS 已介紹,再也不贅述~
具體命令
git branch
複製代碼
命令介紹 查看本地分支
命令結果
IDEA或者AS 點擊右下角紅色部分便可展現本地分支和遠程分支,而且能夠切換分支。
命令介紹 建立一個分支。
具體命令
git branch <name>
複製代碼
必須加上分支名。
動畫效果
IDEA或者AS 跟分支查看的按鈕在同一處,點擊「New Branch」完成。
命令介紹 切換分支
具體命令
git checkout <name> git checkout -b <name> 複製代碼
第一個命令是切換分支,第二個命令是建立並切換分支,git checkout
也能夠用來撤回工做區的修改,你們注意區分。
動畫效果 圖片中不只僅是切換分支,切換完之後,還進行了一次提交,至此,兩個分支就不在同一個版本了。
IDEA或者AS 同查看分支同樣 若是想查看當前各個分支所對應的版本,點擊「Version Control」> 再點擊「log」。
下一個版本的代碼迭代完畢,準備上線,這時你就能夠合併分支。
命令介紹 合併分支。
具體命令
git merge <name>
複製代碼
動畫效果 能夠看到,在
C2
和 C3
的版本下面,合併生成了一個新的版本 C4
,master
分支直接指向了 C4
。
除了 git merge
外,還有一個合併分支的命令,咱們看看這二者有什麼區別。
具體命令
git rebase <分支名>
複製代碼
動畫效果 能夠看到,當前分支
bugFix
指向的版本 C3
失蹤了,而在 master
分支下面生成了一個 C3'
,雖然看不出 C3'
是由原來的 C2
和 C3
合併的,但新的提交記錄更加線性和簡潔。
從 git merge
和 git rebase
兩種動畫效果能夠得出:
Merge
:保留以前的提交順序。
Rebase
:獲得的提交歷史更加線性,看着更加簡潔。大部分團隊的選擇。
IDEA或者AS 選中右下角「git:分支名」> 選中具體分支 > 選擇Rebase或者Merge
團隊協做時每次要上傳代碼以前記得拉取最新代碼。
命令介紹 拉取最新代碼
具體命令
git pull <origin> <local分支名>
複製代碼
這裏的 origin
是咱們遠程分支的別名,是能夠本身定義的,一般咱們使用 git remote add <origin> <遠程倉庫地址>
來添加。
動畫效果 能夠看到,遠程的代碼被拉下來之後,若是你的代碼已經提交過,它會先
merge
代碼,以後再將當前分支切換到最新的版本。
IDEA或者AS 這是 「VCS」>「Git」>「Remotes」下遠程倉庫的記錄: 你能夠選擇左下角的添加按鈕手動添加。
下拉代碼就更加簡單了,點擊右上角的按鈕,第一次下拉的時候會生成一個彈窗 左邊的
Update Type
就很少介紹,右邊的 Clean working tree before update
有兩個選項,第二個並非 Git 中的,而且 IDEA 也說了之後會去除,咱們就無需瞭解了,選擇 Using Stash
就對了。
Using Stash
對應着 Git 命令中的 git stash
,由於合併兩個分支前須要提交改動的代碼,但咱們當前的開發尚未完畢,不想平白無故的進行一次提交從而髒了咱們的提交記錄,這時就可使用git stash
,它會先將工做區的代碼暫存好,以後清空工做區的代碼,合併遠程分支的代碼,最後再將工做區的代碼恢復。
處理衝突 但凡是協做開發,在工做合理分配的狀況下偶爾也會出現衝突,選用《關於Android Studio使用Git的總結》中的圖片,當出現衝突時,會出現以下彈框 除非明確的知道使用誰的代碼,通常咱們會點「Merge...」,以後會出現另一個彈框
從圖中能夠很清晰的看出,彈框分爲左中有三塊:
若是想選擇左邊的代碼,點擊左邊「>>」按鈕,不想選擇點「x」按鈕,肯定好代碼之後點擊右下角的「Apply」按鈕。
除了下載最新的代碼,咱們還須要將本身改動的代碼上傳。
命令介紹 上傳最新的代碼。
具體命令
git push <origin> <本地分支名>
複製代碼
動畫效果 左邊是本地分支,右邊是遠程分支。
IDEA或者AS 正常咱們在 commit 代碼的時候,能夠選擇 Commit and Push
,也就是提交代碼的時候附帶 Push
。 若是你不想在
Commit
的時候進行 Push
,也能夠選擇在菜單欄中的「VCS」選擇單獨 Push
。
在上面的推送命令中,默認了遠程倉庫的分支和當前的分支名一致,好比 git push origin master
,本地分支名和遠程分支的名稱都爲 master
,那若是不一致呢?
具體命令
git push <origin> <本地分支:遠程分支>
複製代碼
更新的命令也是如此
git push <origin> <遠程分支:本地分支>
複製代碼
直接看可能有點抽象,咱們直接看圖。
動畫效果 此次試用了相對引用,即
foo^
指向 foo
分支指向的版本的上一個版本,因此遠程倉庫 master
分支也只更新到了 foo
分支指向版本的上一個版本。
使用 Hash 值指定版本並不老是很方便,好比你想將版本 revert
到上個版本,你得先查一下版本的 Hash 值,以後再去使用這個 Hash 值去 revert
,顯然這樣的方式並不優雅。
命令介紹 指定當前版本的上一個版本。
具體命令
HEAD^ 分支^ Hash值^ 複製代碼
這裏使用 HEAD
、分支和 Hash
值均可以,只要能肯定版本庫便可。
好比上一個版本的代碼代碼出現 bug 了,我想在 master
分支上一個版本的基礎上對代碼進行修改,我能夠輸入 git checkout -b bugfix master^
。
動畫效果 這是一個分離
HEAD
的命令,將 HEAD
分離到當前 master
分支指向版本的上一個版本。
命令介紹 回退到指定版本的前N個版本。
具體命令
HEAD~2 分支~n Hash值~n 複製代碼
其餘和上一個命令類似,再也不贅述。
你剛提交了一筆代碼,忽然發現了一個錯誤,這時你確定不想爲此再建立一個提交。
命令介紹 更新上次 commit 的代碼,避免再次生成一個 commit 記錄。
具體命令
git commit --amend
複製代碼
動畫效果 能夠從動圖中看到,原先的版本庫
C2
消失了,取而代之的是 C2'
,它們兩個實際上是一個版本,對應的 id 是同一個。
IDEA或者AS 選中「Amend commit」,至於「Sign-off commit」,日常基本用不着。
以上的命令已經能夠勝任平時的開發,而對於一些複雜的命令,使用的時候再查。若是你有一些常用的命令,也歡迎在評論區補充。
進入新公司已經一個月了,終於恢復到了本身的節奏,之後就能夠正常輸出文章啦。
我是九心,新晉互聯網碼農,若是想要進階和了解更多的乾貨,歡迎關注個人公衆號接收到的個人最新文章。
引用文章: