【Tools】git操作总结
git操作總結
下載的工程帶有子工程submodule:
當使用git clone下來的工程中帶有submodule時,初始的時候,submodule的內容并不會自動下載下來的,此時,只需執行如下命令:
git submodule update --init --recursive即可將子模塊內容下載下來。
常用的撤銷操作
(1)撤銷本地工作區修改:
git checkout -- <file> 撤銷某個file文件修改 或 git checkout . 撤銷全部文件的修改,但是不能把新增的文件刪除。該命令是用版本庫里的版本替換 工作區的版本,替換為上一次add的版本,就相當于撤銷,無論工作區是修改還是刪除,都可以“一鍵還原”。(2)撤銷已經add到暫存區的修改
git reset HEAD <file> 或 git reset HEAD .(3)撤銷已經commit到版本庫中的修改
可參考 https://www.jianshu.com/p/c2ec5f06cf1a
git reset --soft HEAD^ # 把當前版本回退到上一個版本,會保留工作區修改,和暫存區修改,即只撤銷commit操作,add后的內容和工作區的內容都不會撤銷。 或 git reset (--mixed,該參數可省略) HEAD^ # 把當前版本回退到上一個版本,會保留工作區修改,即變為了add之前的狀態。 或 git reset commit_id # 把當前版本回退到commit_id版本號,會保留工作區修改,變為了add之前的狀態 或 git reset --hard commit_id # 把當前版本回退到某個版本號,會把工作區的所有文件都變回為 commit_id 版本,不會保留工作區修改 或 git reset --hard HEAD^ # 把當前版本回退到上一個版本,不會保留工作區修改。解決沖突的操作步驟
解決沖突之后需要add和commit一遍,還是只需要commit一遍?應該是add+commit吧
先add,再commit,然后才能 git pull --rebase origin 遠程分支名,不add,或者不commit,就不可能pull成功。
git pull --rebase origin 遠程分支名后會有沖突,解決沖突之后使用 git rebase --continue
然后再 git commit --amend --no-edit這樣就不用重新編輯commit信息,(此時不需要再執行git pull --rebase origin 遠程分支名了),然后再 git push origin 本地分支:遠程分支
git diff
git diff commit_id file_name 查看file_name文件和commit_id提交的不同 git diff branch_name file_name 查看file_name文件在本分支和branch_name分支的不同覆蓋已經push到遠程倉庫分支的提交內容 --force-with-lease
當我們push到遠程分支后,發現有問題想修改卻又想去掉遠程倉庫的本次提交,并且此時沒有別人向遠程分支push過內容,就可以使用下面的命令
git reset commit_id # 這個id是上一次的(別人)提交的id,撤銷已commit的修改 git add file # 把修改的文件再重新add一遍 git commit -m "mesage" # 這里的commit消息可以與我們想要覆蓋的消息不一樣,執行下面的最后一步后覆蓋掉之前的提交的的 git push origin branch_name --force-with-lease # 直接git push origin branch_name會被rejected,加上--force-with-lease就可以成功推送然后覆蓋遠程的提交而不產生一個新提交。禁止使用git push --force來推送,因為這樣強制推送會覆蓋掉別人遠程的提交,造成
只提交一部分修改文件,另一部分修改文件不提交
將需要提交的修改文件 git add file_1 file_2,然后git commit -m "message",剩下的不想提交的都git stash``,然后git pull --rebase,然后git push,最后再git stash pop```就可以彈出之前沒有提交的文件,并且這些文件中我們修改過的部分還在。
配置
git config --global user.name "Your Name" git config --global user.email "email@example.com"注意git config命令的--global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。
git diff可以查看修改內容
git diff readme.txt
版本回退
版本回退主要兩個命令:
git reset --hard HEAD^ # 把當前版本回退到上一個版本和
git reset --hard commit_id # 把當前版本回退到某個版本號詳細解釋如下:
在Git中,用HEAD表示當前版本,也就是最新的提交1094adb...,上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。
現在,我們要把當前版本回退到上一個版本,就可以使用git reset命令:
git reset --hard HEAD^HEAD指向的版本就是當前版本,HEAD^指向的版本就是上一個版本.
Git允許我們在版本的歷史之間穿梭,使用命令:
git reset --hard commit_idcommit id(版本號)是一大串類似1094adb…
穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個版本。
要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。
工作區、暫存區、版本庫
工作區就是本地修改的文件,在電腦里能看到的目錄,比如我的study-cidi文件夾就是一個工作區;
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支;
版本庫包含暫存區stage和master分支和Head指針,Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
撤銷修改
(1)命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區的修改全部撤銷。命令中的兩個橫杠--很重要,沒有--,就變成了“切換到另一個分支”的命令。git checkout -- readme.txt其實是用版本庫里的版本替換工作區的版本,替換為上一次add的版本,就相當于撤銷,無論工作區是修改還是刪除,都可以“一鍵還原”。
(2)命令git reset HEAD <file>可以把暫存區的修改撤銷掉(unstage),重新放回工作區,如:
git reset HEAD readme.txt可把已經add到暫存區的文件修改撤銷掉。
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時:
用命令git checkout -- file
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改:
分兩步,第一步用命令git reset HEAD <file>,就回到了場景1,第二步按場景1操作:
git reset HEAD <file> # 把已經```add```到暫存區的文件修改撤銷掉,這一步后只剩下工作區的修改了 git checkout -- file # 把file文件在工作區的修改全部撤銷。場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫:
版本回退主要兩個命令:
git reset --hard HEAD^ # 把當前版本回退到上一個版本和
git reset --hard commit_id # 把當前版本回退到某個版本號(1)撤銷本地工作區修改:
git checkout -- <file> 撤銷某個file文件 或 git checkout . 撤銷全部文件的修改,但是不能把新增的文件刪除。該命令是用版本庫里的版本替換工作區的版本,替換為上一次add的版本,就相當于撤銷,無論工作區是修改還是刪除,都可以“一鍵還原”。(2)撤銷已經add到暫存區的修改
git reset HEAD <file> 或 git reset HEAD .(3)撤銷已經commit到版本庫中的修改
git reset --hard HEAD^ # 把當前版本回退到上一個版本 或 git reset --hard commit_id # 把當前版本回退到某個版本號刪除文件
??當你把文件git add test.txt添加到版本庫后,想要刪除該文件,可以 rm test.txt,也可以手動刪除,然后Git知道你刪除了文件,因此,工作區和版本庫就不一致了,接下來就需要在版本庫中刪除test.txt,使用git rm test.txt,注意這兩個命令加不加git是有差別的。要從版本庫中刪除該文件,那就用命令git rm test.txt刪掉,并且git commit -m 'msg'.
當你rm刪錯某個文件了(不是git rm),因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復到最新版本:
git checkout -- test.txtgit checkout -- test.txt其實是用版本庫里的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
注意:從來沒有被添加到版本庫就被刪除的文件,是無法恢復的!
SSH
????為什么GitHub需要SSH Key呢?因為GitHub需要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,所以,GitHub只要知道了你的公鑰,就可以確認只有你自己才能推送。
??Git支持多種協議,包括https,但通過ssh支持的原生git協議速度最快。使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內部就無法使用ssh協議而只能用https。
????第1步:創建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認值即可,由于這個Key也不是用于軍事目的,所以也無需設置密碼。
如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
??第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面,然后,點“Add SSH Key”,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內容.點“Add Key”,你就應該看到已經添加的Key.
關聯遠程庫
要關聯一個遠程庫,使用命令
git remote add origin git@server-name:path/repo-name.git關聯后,使用命令git push -u origin master第一次推送master分支的所有內容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
分支
Git鼓勵大量使用分支:
1.查看分支:git branch
2.創建分支:git branch <name>
3.切換分支:git checkout <name>
注意區分git checkout -- readme.txt是撤銷工作區修改的指令,不要混淆了
4.創建+切換分支:git checkout -b <name>
相當于執行下面這兩條命令:
git branch <name> git checkout <name>5.合并某分支到當前分支:git merge <name>
6.刪除分支:git branch -d <name>
7.查看分支合并圖:git log --graph
每個歷史一行:git log --graph --pretty=oneline
每個歷史一行,并且commit_id使用縮略:git log --graph --pretty=oneline --abbrev-commit
8.查看命令歷史:git reflog
合并分支 和 Fast forward
需要把某個分支branch-1合并到另一個分支branch-2,需要先切換到branch-2:git checkout branch-2,然后再合并git merge branch-1即可。
git checkout master git merge dev上面這種合并分支時,由于當前 master 分支所在的提交對象是要并入的 dev 分支的直接上游,Git 只需把 master 分支指針直接右移。換句話說,如果順著一個分支走下去可以到達另一個分支的話,那么 Git 在合并兩者時,只會簡單地把指針右移,因為這種單線的歷史分支不存在任何需要解決的分歧,所以這種合并過程可以稱為快進(Fast forward)。
??合并分支時,加上--no-ff參數就可以用普通模式合并,合并后的歷史有分支,能看出來曾經做過合并,而fast forward合并就看不出來曾經做過合并。
準備合并dev分支,請注意–no-ff參數,表示禁用Fast forward:
git merge --no-ff -m "merge with no-ff" dev因為本次合并要創建一個新的commit,所以加上-m參數,把commit描述寫進去。
master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;
干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合并到master上,在master分支發布1.0版本;
你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支(例如:我的是zhuhz分支),時不時地把(zhz分支)往dev分支上合并即可,不要合并到master。
bug分支
之所以用到git stash暫存工作現場,而不提交,并不是你不想提交,而是工作只進行到一半,還沒法提交,預計完成還需1天時間。但是,必須在兩個小時內修復該bug,怎么辦?
幸好,Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以后恢復現場后繼續工作.
疑問:為什么不add一下,并不commit,這樣不行嗎?還是說add之后就會把所有的各個分支上add的東西都放在了一起,你下次在add別的分支上的修改之后add了commit,也會把我現在這個分支上的修改給一起commit?記得試驗一下。弄懂原因。
git stash git stash listGit把stash內容存在某個地方了,但是需要恢復一下,有兩個辦法:
一是用git stash apply恢復,但是恢復后,stash內容并不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了.
在master分支上修復的bug,想要合并到當前dev分支,可以用git cherry-pick <commit_id>命令,把bug提交的修改“復制”到當前分支,避免重復勞動。
修改最近一次的commit內容
git commit --amend然后會自動在用默認編輯器vim中打開一個文件COMMIT_EDITMSG,修改第一行信息即可。如果是默認vim,那不會有問題,如果是默認是gedit,這種方法沒用,只能改為默認用vim編輯,方法是git config --global core.editor vim。
git commit -am "haha"等價于下面兩條命令:
git add . git commit -m "haha"總結
以上是生活随笔為你收集整理的【Tools】git操作总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚函数和纯虚函数的区别
- 下一篇: 【opencv】1.opencv安装、编