本篇爲git使用過程中的一些操作記載,不定期更新。
目錄
- -------------------git 常規一套流程
- -------------------git 放棄修改(add、commit)
- -------------------git pull/push/fetch
- -------------------git關聯本地與遠程分支
- -------------------git branch 查看(刪除)分支
- -------------------git tag
- -------------------git 恢復reset刪除(本地分支的commit被reset了)
- -------------------git config
- -------------------關於git不清洗緩衝區不能切分支的問題。
- -------------------git merge(合併分支&&commit)
- -------------------git remote
- -------------------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