Git 操作彙總

本篇爲git使用過程中的一些操作記載,不定期更新。

目錄

  1. -------------------git  常規一套流程
  2. -------------------git 放棄修改(add、commit)
  3. -------------------git  pull/push/fetch
  4. -------------------git關聯本地與遠程分支
  5. -------------------git branch  查看(刪除)分支  
  6. -------------------git  tag 
  7. -------------------git  恢復reset刪除(本地分支的commit被reset了)
  8. -------------------git  config
  9. -------------------關於git不清洗緩衝區不能切分支的問題。
  10. -------------------git  merge(合併分支&&commit)
  11. -------------------git  remote
  12. -------------------git  submodule


-------------------git  常規一套流程

git  clone http://github.com/jquery/jquery.git   克隆遠程倉庫到本地
git  status              //(最常用的命令) 查看當前代碼庫當前分支的變化,包括 沒有add的文件和已提交等待push的commit 
如果本地代碼都push到遠程了會返回類似 nothing to commit, working tree clean
git  add  .              //將當前目錄下的所有修改添加到本地暫存區。
git  commit -m  '這是提交的註釋,gitlab會看到描述'   //添加本地暫存區的數據到本地的分支(HEAD)
git  pull origin master  //push前先拉gitlab的代碼是個好習慣、(此時可能會有衝突)
如果有衝突(別人更新了遠程代碼庫) 就合併一下,這塊建議在idea這種自帶git工具或者 source Tree 這種工具中玩,比較方便。 然後可以選擇 merge/rebase
merge會將分支樹變醜,默認是merge 然後再commit 就可以push了。
git  push origin  master //將本地master的commit提交到遠程。

-------------------git 放棄修改(add、commit)

git checkout .               //放棄本地 add操作之前的修改。
git checkout -- a/b.txt      //放棄本地指定文件的修改(未add的文件)。   如果是新創建的文件直接手動刪除就好了。
git reset HEAD a.txt         //放棄 add 但沒commit的修改。(已經add的文件)
git reset --hard HEAD ^      //放棄本次commit、  HEAD ^ 可以根據commitID進行修改。  git log查看、
git reset --hard commitID    //回滾當前分支版本的修改到某一個提交。 這個commitID 是你要回滾到的commitID
git push -f origin master    //回滾完需強制提交。(gitlab不會被污染) origin master 根據分支不同需要切換。


-------------------git  pull/push/fetch

git push <遠程主機名> <本地分支名>:<遠程分支名>
將本地的master分支推送到origin主機的master分支。如果master不存在,則會被新建
git push  origin --delete dev      //刪dev分支本地與遠程的聯繫,並在遠程刪除dev分支。  origin 是遠程主機名。默認origin
git push origin :foo               //空 source 會刪除遠程倉庫中的foo分支。
git push -u origin master          //將本地的master分支推送到origin主機, -u指定origin爲默認主機,後面就可以不加任何參數使用git push
git push origin                    //將當前分支推送到遠程。
git push origin master^:newBranch  //檢索master^ 推送到遠程的newBranch 推送的分支不存在創建新分支

git fetch origin foo               //抓遠程的foo分支到本地的  origin/foo分支   所取回的更新,在本地主機上要用”遠程主機名/分支名”的形式讀取
也可以使用git merge命令或者git rebase命令,在本地分支上合併遠程分支. git merge origin/master 就合併fetch的信息到當前分支了。
git fetch origin foo^:bar          //抓遠程foo提前一個commit的記錄到本地    本地bar分支不存在就本地創建   
如果 git fetch 沒有參數,它會下載所有的提交記錄到各個遠程分支!!!
git fetch origin :bar              //如果fetch空 source 會在本地創建一個分支 bar 

git pull origin foo                //相當於git fetch origin foo; git merge origin/foo
git pull origin master             //會將遠程的master抓下來並與當前分支合併,無論我們當前檢出的位置是哪。
git pull origin master:foo         //抓取master,將foo指向master的commit  合併當前位置與抓下來的master

-------------------git關聯本地與遠程分支

1.本地已有分支,建立關聯關係
git branch --set-upstream-to origin/feature/1.0.0base  關聯本地當前分支(master)   與遠程 feature/1.0.0base 分支

2.本地尚未有分支,新建分支並創建關聯關係(常用)
git checkout -b feature/1.0.0base   origin/feature/1.0.0base
新建本地 feature/1.0.0base 分支關聯到遠程的指定分支


-------------------git branch  查看(刪除)分支  

git branch -a                  //查看遠程的所有分支  

git branch -v                  //查看本地分支與遠程分支的對應關係。

git branch -vv                 //查看本地與遠程分支的對應關係。

git branch -r                  //列出遠程分支。

git branch -d                  //刪除本地分支。

如果想刪除本地dev分支並且刪除遠程庫dev分支,並刪除他倆之間的聯繫。

git branch -d dev              //刪本地dev分支
 
git push  origin --delete dev  //刪dev分支本地與遠程的聯繫,並在遠程刪除dev分支。


-------------------git  tag 

git tag 是以當前的HEAD的 commit記錄來打tag的。

git tag                   //查看tag
git tag v1.1.0            //給當前分支打tag
git tag v1.0.0 039bf8b    //給指定commit打tag
git tag --delete v1.0.0   //刪除本地tag
git push -d origin v1.0.0 //刪除遠程tag   ==>  git push --delete origin v1.0.0

git push origin v1.0.0    //推送本地指定tag
git push --tags           //推送所有本地tag

-------------------git  恢復reset刪除(本地分支的commit被reset了)

git reflog  查看被reset的commit

然後再執行  git reset --hard HEAD@{XXX} 來恢復。

-------------------git  config

git config --system --list     ----查看系統的配置。

git config --global --list     ----查看全局的配置。
 
git config --local  --list     ----查看當前倉庫的配置。

底層配置會覆蓋頂層配置

舉個栗子。
git config --global user.name "myname"
git config --global user.email  "[email protected]"

-------------------關於git不清洗緩衝區不能切分支的問題。

有如下幾種處理方式:
1. git add並且git commit,再git checkout,提交到當前分支
2. git add但不git commit,可以git stash,然後git checkout到新分支,做修改,然後git checkout回到之前的分支之後git stash apply,再git commit,提交到之前的分支
git stash apply stash@{2} 到應用指定的stash存儲桶、
3. git add但不git commit,也不git stash,直接git checkout到新分支,做修改,然後再git commit的話,記錄就在切換後的分支下面。

其背後的原因:一個本地的git repo只有一個工作區和暫存區,但是有多個分支的提交區,而我們的checkout只是將HEAD指針從一個分支切換到另一個分支。


-------------------git  merge(合併分支&&commit)


合併其他分支的代碼到當前分支。
git  merge  hotfix   合併  hotfix分支的代碼到  當前的分支。 (合併的是分支)
當我們只需要合併一個commit時,就只需 git checkpick    1heohdqi2ud     將指定的commitID 合併到當前分支、
還有一種是使用rebase  rebase和merge的區別就是 rebase更好看一些。不會讓git tree 亂七八糟的。
git rebase --onto master 76cada^
git rebase side1 side2   將side2 合併到side1下面。rebase  commit  side只是一個標誌HEAD。可以寫成分支名稱。


-------------------git  remote

git remote update origin --prune   # 更新遠程主機origin 整理分支

git remote -v                      # 列出詳細信息,包括庫和URL地址。

-------------------git  submodule

git submodule add https://www.gitlabxxx.com/zhangyong.git ext/zhangyong

上面這個命令是在父.git 下執行的。將子模塊添加到了 父目錄下/ext/zhangyong處。  
在提交父項目到gitlab時不會將ext/zhangyong中的所有文件都提上去,而是在zhangyong這個文件中記錄https://www.gitlabxxx.com/zhangyong.git 的commitID

//雖然是工作目錄中的一個子目錄,但 Git 還是會將它視作一個子模塊。當你不在那個目錄中時,Git 並不會跟蹤它的內容, 而是將它看作該倉庫中的一個特殊提交。

git diff --cached --submodule    // 查看子模塊的信息。

克隆項目到本地
git clone --recursive http://gitlabxxx.com/zhangyong/MainProject

上述命令相當於先 git  clone  http://gitlabxxx.com/zhangyong/MainProject 在到對應的子模塊中順序執行git submodule init git submodule update 將子模塊的代碼拉下來、

更新子模塊
1.父目錄下運行  git submodule foreach git pull
2.子模塊中執行  git pull

刪除submodule

git rm --cached  sql_source/s1      //變更父.git的index文件
rm -rf sql_source/s1                //刪除子模塊文件(夾)
vim .gitmodules                     //變更module配置文件  刪除對應的子模塊信息
vim .git/config                     //變更配置信息

[submodule "sql_source/s1"]
  path = sql_source/s1
  url = [email protected]:zhangyong.git

 

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