淺談Git之Git 常用命令小記(1)

Git 常用命令小記


1、創建工作空間
cd /d/GitTest/      切換到一個空目錄  
git clone [email protected]:dev/test.git      克隆項目到本地 
git config user.name "XXXX"     配置用戶名
git config user.email XXXX      配置郵箱
git checkout master     (可不用,當前默認爲master,後期多個分支時可使用git checkout來切換)
git pull --rebase      拉取內容
git branch -a      查看分支

2、分支
--新建分支
git branch testBranchName

切換分支
git checkout master

提交分支
git push origin testBranchName

修改之前要拉取內容,減少衝突
git pull --rebase
git pull origin master


3、文件提交
Git提交文件:
git status
git add ./  提交所有文件
git commit -m "updateTable1 sql" 
git push 
git push --set-upstream origin testBranchName
git push origin testBranchName //推送到遠端


4、分支合併
將testBranchName分支的修改合併到master,處在master上執行
git merge testBranchName


5、刪除分支:
Git-命令行-刪除本地和遠程分支


查看項目的分支們(包括本地和遠程) 
命令行 : $ git branch -a


刪除本地分支 
命令行 : $ git branch -d <BranchName>


刪除遠程分支 
命令行 : $ git push origin --delete <BranchName>


刪除本地分支 git branch -d XX 提示:  the branch  XXX is not fully merged
原因:XXX分支有沒有合併到當前分支的內容
使用大寫的D 強制刪除  git branch -D XXX   


6、刪除文件
Git刪除文件:本地和分支上都刪除
git rm  路徑/文件名


7、拉取分支
基於某一個分支拉取一個分支
git checkout -b issue_33060(新建分支的名字) origin/master(遠端倉庫)


8、Git-命令行-忽略文件 .gitignore 


在.gitignore 文件添加想要忽略的文件,類似:
*.xml.bak
*rebel.xml
rebel-*.xml
*.classpath
*.settings
*.project
*.iml
*.vscode/


9、“Your local changes to the following files would be overwritten by checkout” (切換分支)解決:
當前分支有未跟蹤的文件,checkout 命令會覆蓋它們,請緩存( stash )或者提交( commit )。

1.未跟蹤文件的內容改動很重要,保存修改
//第一種方式 存到暫存區
git add .
git stash 
//取出的時候使用 
git stash pop

//第二種方式 發起一個commit 存到提交歷史
git add.
git commit -m "commit message"


2.未跟蹤文件的內容改動不重要,放棄修改

git log 查看日誌
未使用 git add 緩存代碼時。

可以使用 git checkout -- filepathname 
(比如: git checkout -- readme.md  ,不要忘記中間的 “--” ,不寫就成了檢出分支了!!)。放棄所以的文件修改可以使用 git checkout .

已經使用了  git add 緩存了代碼。
可以使用  git reset HEAD filepathname 
(比如: git reset HEAD readme.md)來放棄指定文件的緩存,放棄所有的緩存可以使用 git reset HEAD

已經用 git commit  提交了代碼。
git reset --hard HEAD^ 來回退到上一次commit的狀態。
此命令可以用來回退到任意版本:git reset --hard  commitid


10、檢出遠端的文件,覆蓋本地的文件,拉取某個分支的一個類


git checkout origin/branchName com/src/main/java/com/everhomes//XXXXCommand.java
  
git merge --abort    // 中止合併  


11、“dst refspec branch matches more than one”


當遠程倉庫同時存在相同名稱的 branch 和 tag 時,不指明絕對路徑的前提下,操作這個名稱的 branch 和 tag 都會出現這個問題。
解決方法很簡單,指明操作對象的絕對路徑就能準確操作了。


//刪除 dev_test 分支
git push origin :refs/heads/dev_test


//刪除 dev_test 標籤
git push origin :refs/tags/dev_test


12、使用 git add . “warning: CRLF will be replaced by LF in XXX . The file will have its original line endings in your working directory.” .
就是文件中存在兩種環境的換行符,git 會自動替換 CRLF 爲 LF ,所以提示警告。


解決方法,非常簡單,就一個命令行就可以解決的問題。
git config core.autocrlf false  //將設置中自動轉換功能關閉


13、git stash 分支切換的時候 非常好用的命令
在一個分支上開發,需要切換到另一個分支修改bug,使用git stash 暫存當前修改,切換到bug分支,完成後git stash pop 取出
原分支的修改,繼續修改,不會產生無意義的提交歷史,也不會導致代碼丟失。


git stash  show  //查看剛纔暫存的修改


git stash pop //取出剛纔暫存的修改


存儲多個 stash 的情況
當使用git stash 創建 stash 的時候,會給 stash 一個默認的名稱。


git stash list //查看暫存區的所有暫存修改記錄


上面的演示中,取出 stash 的方式都是


git stash pop  //取出最近一次暫存並刪除記錄列表中對應記錄。


因爲 git stash pop 是彈出棧頂的一個 stash ,也就是最後一次存儲的 stash。在存儲多個stash ,想取出非棧頂的一個的情況下,是不適用的。


這個時候要使用:
git stash list //查看暫存區的所有暫存修改
git stash apply stash@{X} //取出相應的暫存
git stash drop stash@{X} //將記錄列表中取出的對應暫存記錄刪除


14、分支合併使用到的命令是:


git merge <branch name>




15、代碼回滾:
確定回滾到哪個提交,找到該提交的 commit id,執行以下命令,就好了


git reset --hard commit id


遠程分支回滾
依舊是個僞命題。遠程分支不存在什麼回滾,要想達到回滾的效果,就是刪除之前的遠程分支,然後把本地回滾好的本地分支,push 到遠程。


git reset --hard commit id //本地分支回滾
git push origin :<name> //刪除遠程分支
git push origin <name> //用回滾後的本地分支重新建立遠程分支




git代碼庫回滾: 指的是將代碼庫某分支退回到以前的某個commit id
1、本地代碼回滾到上一版本(或者指定版本)
git reset --hard fea35931
git reset --hard HEAD~1
git merge master
2、加入-f參數,強制提交,遠程端將強制跟新到reset版本
git push -f origin master 




16、Swap file .MERGE_MSG.swp already exists:


問題解決:


第一步:回到合併前狀態


git merge --abort  // 中止合併
rm .git/.MERGE_MSG.sw* //刪除 vim 非正常關閉產生的文件


第二步:重新合併 
合併提交信息頁面,使用 :wq! 或者 :q! 正常退出 VIM ,就能正常合併啦。




17、GitHub Flow 模型簡單說明
只有一個長期分支 master ,而且 master 分支上的代碼,永遠是可發佈狀態,一般 master 會設置 protected 分支保護,只有有權限的人才能推送代碼到 master 分支。
如果有新功能開發,可以從 master 分支上檢出新分支。
在本地分支提交代碼,並且保證按時向遠程倉庫推送。
當你需要反饋或者幫助,或者你想合併分支時,可以發起一個 pull request。
當 review 或者討論通過後,代碼會合併到目標分支。
一旦合併到 master 分支,應該立即發佈。




18、cherry-pick 的翻譯是擇優挑選,使用git cherry-pick命令,可以選擇將現有的一個或者多個提交的修改引入當前內容。


假設你現在正在開發一個項目,有一個功能分支 feature,開發分支 develop。 feature 有3個提交,分別是 A ,B ,C 。
develop 分支只想加入 C 功能, 此時合併操作無法滿足,因爲直接合並 feature,會將3個提交都合併上,我想合併就只有 C,不要 A,B。此時就需要–cherry pick!


具體的做法:


切換到 develop 分支。
通過 git log feature,找到 C 的 SHA1 值。
通過 git cherry-pick <C的SHA1> ,將 C 的修改內容合併到當前內容分支 develop 中。
若無衝突,過程就已經完成了。如果有衝突,按正常衝突解決流程即可。


cherry-pick 操作的對象就是 commit。 
merge 操作的對象就是 commit history。




19、rebase 命令


rebase 和 merge 本質上做的是一個事情,都是分支歷史的合併。


rebase 操作的思想上分爲兩個步驟: 
1. 確定變基對象:就是你改變的是哪個分支的提交,然後 checkout 到此分支。 
2. 選好 base :選好作爲基點的提交,形象地來說,就是你要變到那條線上。 
3. 開始 re :rebase 基提交。


rebase 爲每一個變基後的提交都創建了一個內容相同新的提交。 
develop 的兩個變基提交 創建 develop1.txt 文件和創建 develop2.txt 文件的 SHA1 值都發生的變化,都是新創建的提交。
變基前的提交已經被丟棄,已經被回收或者正在等待回收。


變基後的提交會依次排到 master 分支的後面。 
注意到創建 master1.txt 文件 這個提交的時間是比 develop 分支的兩個提交要晚的,如果是 merge 操作的話,分支的歷史,會根據時間把 創建 master1.txt 文件 放在 develop 兩個提交的後面。
但 rebase 操作會所有變基的對象會直接整個排到基礎提交的末端,不會讓分支歷史混亂。(關於 merge 的提交合並,你平時可以觀察一下,是不是)






20、Pull is not possible because you have unmerged files解決:解決衝突
1.pull會使用git merge導致衝突,需要將衝突的文件resolve掉 git add -u, git commit之後才能成功pull.
2.如果想放棄本地的文件修改,可以使用git reset --hard FETCH_HEAD,FETCH_HEAD表示上一次成功git pull之後形成的commit點。然後git pull.
注意:

 

 

git merge會形成MERGE-HEAD(FETCH-HEAD) 。git push會形成HEAD這樣的引用。HEAD代表本地最近成功push後形成的引用。

 

 

 


每天努力一點,每天都在進步。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章