git按照tag拉取代码_Git实操小课堂
平時也多是使用 IDEA 自帶的 Git 插件,簡單又方便,不需要理解 Git 背后的技術,最近突然讓我在 VsCode 上更新提交代碼,發現又需要學習 VsCode 的插件使用,思量一番后,決定好好學習一下 Git 命令的使用。由于工作需要,對于 Git 的使用又有了新的要求,之前簡單的 push、pull 命令已經無法滿足平常的使用,因此專門找了個網站實操了一遍,同時將相關內容整理成文檔,供后續翻看。
Git基本操作
以下操作來源:https://learngitbranching.js.org/?locale=zh_CN
commit提交
git commitGit 倉庫中的提交記錄保存的是你的目錄下所有文件的快照,就像是把整個目錄復制,然后再粘貼一樣,但比復制粘貼優雅許多!
有時你提交過代碼之后,發現一個地方改錯了,你下次提交時不想保留上一次的記錄;或者你上一次的 commit message 的描述有誤,這時候你可以使用接下來的這個命令:git commit --amend。
查看如下案例:
$ git checkout master $ git cherry-pick C2 $ git commit --amend $ git cherry-pick C3branch創建分支
git branch newBranchName創建分支后,然后切換到當前新分支下。
git checkout newBranchName如果你想創建一個新的分支同時切換到新創建的分支的話,可以通過 git checkout -b 來實現。
git checkout -b newBranchName查看遠程分支
git branch -r拉取遠程分支并創建本地分支
git checkout -b 本地分支名x origin/遠程分支名x使用該方式會在本地新建分支x,并自動切換到該本地分支x。采用此種方法建立的本地分支會和遠程分支建立映射關系。
git fetch origin 遠程分支名x:本地分支名x使用該方式會在本地新建分支x,但是不會自動切換到該本地分支x,需要手動 checkout。采用此種方法建立的本地分支不會和遠程分支建立映射關系。
checkout檢出/切換分支
將指定版本/tag/分支的代碼檢出,如果當前存在未提交的代碼禁止做此操作。
merge合并
合并兩個分支,存在沖突時,能自動合并的會自動合并,不能自動合并的會產生沖突,需要人工處 理。解決沖突的時候,只需要處理沖突的文件,當前工作目錄會存在大量提交的文件,不要去還原這些文件,不要去還原這些文件,不要去還原這些文件。
// 創建bugFix新分支,并切換到該分支 git checkout -b bugFix; //加入做了修改,然后提交 git commit //切換到master分支,然后做修改并提交 git checkout master git commit //將bugFix分支的內容合并到master git merge bugFix分離Head
目標: 從 bugFix 分支中分離出 HEAD 并讓其指向一個提交記錄。
執行下述命令:
git checkout master git checkout C4移動
// 切換分支到C2的父節點C1 git checkout C2^上述 ^ 命令一次只能移動一個位置,比較緩慢。接下來我們學習一個新命令。
移動分支可以直接使用 -f 選項讓分支指向另一個提交。例如:
git branch -f master HEAD~3上面的命令會將 master 分支強制指向 HEAD 的第 3 級父提交。
如何將下圖中右邊的分支修改成左邊的樣式:
$ git checkout HEAD^ $ git branch -f bugFix HEAD^ $ git branch -f master C6^ 和 ~ 的組合操作
上述三條命令可以簡化為下面一條命令。
作業:
git branch bugWork HEAD~^2~ 或者 git branch -f bugWork撤銷變更
主要有兩種方法用來撤銷變更 —— 一是 git reset,還有就是 git revert。
git reset 通過把分支記錄回退幾個提交記錄來實現撤銷改動。你可以將這想象成“改寫歷史”。git reset 向上移動分支,原來指向的提交記錄就跟從來沒有提交過一樣。
將HEAD 的代碼重置到指定版本/tag/分支,重置分成三種,此操作非常危險,非特殊情況禁止此操作
- soft :軟重置,重置位置,差異代碼會暫存
- mixed :混合重置,重置位置,差異代碼不會暫存
- hard :硬重置,重置位置和代碼
雖然在你的本地分支中使用 git reset 很方便,但是這種“改寫歷史”的方法對大家一起使用的遠程分支是無效的哦!為了撤銷更改并分享給別人,我們需要使用 git revert。
作業:分別撤銷 local 分支和 pushed 分支上的最近一次提交。共需要撤銷兩個提交(每個分支一個)。
記住 pushed 是遠程分支,local 是本地分支 —— 這么說你應該知道用分別哪種方法了吧?
$ git reset local~ $ git checkout pushed $ git revert pushed作業:
$ git reset HEAD~1 $ git checkout pushed $ git revert HEAD作業:
// Git 中默認的是 --mixed。 git reset --hard o/master git checkout -b feature C2 git push origin feature上述命令為標準答案,本人通過另一種方式實現的。
git checkout -b feature git branch -f master C1 git pushcherry-pick復制
作業:
$ git cherry-pick C3 C4 C7again:
$ git checkout one $ git cherry-pick C4 C3 C2 $ git checkout two $ git cherry-pick C5 C4 C3 C2 $ git branch -f three C2stash暫存
將當前未提交的代碼存放到一個暫存區當中,如果你要做以下其他任何操作,但是當前存在未提交的代碼
如果開發完成,則提交后做其他操作
如果沒有開發完成,則暫存后進行其他操作
其他操作完畢后,將暫存區的代碼恢復到當前工作目錄。恢復的方式有兩種,一種是應用(apply),僅恢復代碼,不清除暫存區的內容。另一種是彈出(unstash),恢復代碼并清空暫存區的代碼。建議使用應用(apply**)**。
暫存區內可以暫存多次代碼,恢復的時候不要選錯。
pull拉取
從服務器拉取代碼,不指定拉取的分支時會使用當前分支的上游分支(upstream)。如果當前代 碼和服務器的代碼存在差異,會自動進行一次合并,如果存在沖突并且不能自動處理,會有提示要 人工解決,因此即使本地不存在任何未提交的代碼,但是還是會有可能提示沖突。
git pull 相當于 git fetch + git merge
git pull origin foo 相當于:
git fetch origin foo; git merge o/foo還有...
git pull origin bar~1:bugFix 相當于:
git fetch origin bar~1:bugFix; git merge bugFix作業:
git pull origin bar:foo git pull origin master:sidepush推送
將當前代碼推送到服務器上,不指定拉取的分支時會使用當前分支的上游分支(upstream)
git commit git commit git pushgit fetch;git rebase o/master;git pushgit fetch;git merge o/master;git pushgit pull 就是 fetch 和 merge 的簡寫,類似的 git pull --rebase 就是 fetch 和 rebase 的簡寫!
進階
git push <remote> <place>git push origin master ,切到本地倉庫中的“master”分支,獲取所有的提交,再到遠程倉庫“origin”中找到“master”分支,將遠程倉庫中沒有的提交記錄都添加上去,搞定之后告訴我。
擺脫 git checkout 的束縛,用 git push 實現下面的目標。
$ git push origin master $ git push origin foo要同時為源和目的地指定 的話,只需要用冒號 : 將二者連起來就可以了:
git push origin <source>:<destination>作業:
$ git push origin foo:master $ git push origin C5:fooGit 有兩種關于 的用法是比較詭異的,即你可以在 git push 或 git fetch 時不指定任何 source,方法就是僅保留冒號和 destination 部分,source 部分留空。
- git push origin :side刪除遠程分支
fetch下載
從服務器上獲取代碼到本地,不進行合并。
在上文學習了 git push 的參數,很酷的 參數,還有用冒號分隔的 refspecs( : )。 這些參數也適用于 git fetch 。他們的概念是相同的,只是方向相反罷了(fetch 是下載,而 push 是上傳)
git fetch origin fooGit 會到遠程倉庫的 foo 分支上,然后獲取所有本地不存在的提交,放到本地的 o/foo 上。
作業:
$ git fetch origin master~:foo $ git fetch origin foo:master $ git checkout foo $ git merge C6git fetch origin :bugFix在本地創建一個分支
fakeTeamwork模擬團隊合作
使用 git fakeTeamwork 制造遠程倉庫的變更,“假裝”你的同事、朋友、合作伙伴更新了遠程倉庫,有可能是某個特定的分支,或是幾個提交記錄。
克隆一個遠程倉庫(用 git clone),再在剛創建的遠程倉庫中模擬一些修改,然后在你自己的本地分支上做一些提交,再拉取遠程倉庫的變更。
git clone //假設成員做兩次修改 git fakeTeamwork 2 //本地提交,生成 C4 git commit //更新 git pull作業:
思路:
- 克隆你的倉庫
- 模擬一次遠程提交(fakeTeamwork)
- 完成一次本地提交
- 用 rebase 發布你的工作
如果你是在一個大的合作團隊中工作, 很可能是 master 被鎖定了, 需要一些 Pull Request 流程來合并修改。如果你直接提交(commit)到本地 master, 然后試圖推送(push)修改, 你將會收到這樣類似的信息:
! [遠程服務器拒絕] master -> master (TF402455: 不允許推送(push)這個分支; 你必須使用pull request來更新這個分支.)解決辦法:新建一個分支 feature, 推送到遠程服務器. 然后 reset 你的 master 分支和遠程服務器保持一致, 否則下次你 pull 并且他人的提交和你沖突的時候就會有問題。
$ git reset HEAD~1 $ git checkout -b feature C2 $ git pushrebase變基/衍合
作業:實現如下操作
git rebase -i HEAD~4再來一題:
// 首先將master移動到C4分支 $ git branch -f master C4 // 由bugFix切換到master上 $ git checkout master //復制 $ git rebase -i HEAD~3二思后新的解題思路:
git rebase bugFix master git rebase -i HEAD~3again:(不允許使用 cherry-pick)
//首先將master移動到C3上 $ git branch -f master C3 //檢出master $ git checkout master$ git rebase -i HEAD~2 $ git rebase -i HEAD~1 $ git rebase -i HEAD~2另一種解題思路:
$ git rebase -i HEAD~2 $ git rebase -i HEAD~1 $ git rebase -i HEAD~2 $ git rebase caption master此外著重需要注意下述命令:
git rebase o/master side1 相當于 git checkout side1 git rebase o/master假設 HEAD 在 foo 分支節點上(foo*標識),如果想要將 master 移動到 foo 所在的節點上,并且檢出,則可以通過一條命令來實現。
git rebase foo mastertag
分支很容易被人為移動,并且當有新的提交時,它也會移動。分支很容易被改變,大部分分支還只是臨時的,并且還一直在變。Tag 可以永遠指向某個提交記錄的標識呢,比如軟件發布新的大版本,或者是修正一些重要的 Bug 或是增加了某些新特性。
它們并不會隨著新的提交而移動。你也不能檢出到某個標簽上面進行修改提交,它就像是提交樹上的一個錨點,標識了某個特定的位置。
$ git checkout master $ git cherry-pick C2 $ git branch -f master C1 $ git cherry-pick C2 C3Describe
由于標簽在代碼庫中起著“錨點”的作用,Git 還為此專門設計了一個命令用來描述離你最近的錨點(也就是標簽),它就是 git describe!
Git Describe 能幫你在提交歷史中移動了多次以后找到方向;當你用 git bisect(一個查找產生 Bug 的提交記錄的指令)找到某個提交記錄時,或者是當你坐在你那剛剛度假回來的同事的電腦前時, 可能會用到這個命令。
clone
git clonegit clone 命令在真實的環境下的作用是在本地創建一個遠程倉庫的拷貝(比如從 http://github.com)。
如果你看到一個名為 o/master 的分支,那么這個分支就叫 master,遠程倉庫的名稱就是 o。
大多數的開發人員會將它們主要的遠程倉庫命名為 origin,并不是 o。這是因為當你用 git clone 某個倉庫時,Git 已經幫你把遠程倉庫的名稱設置為 origin 了
不過 origin 對于我們的 UI 來說太長了,因此不得不使用簡寫 o :) 但是要記住, 當你使用真正的 Git 時, 你的遠程倉庫默認為 origin!
思路:在 master 分支上做一次提交;然后檢出 o/master,再做一提交。這有助于你理解遠程分支的不同,他們的更新只是反映了遠程的狀態。
$ git commit $ git checkout o/master $ git commit克隆一個遠程倉庫(用 git clone),再在剛創建的遠程倉庫中模擬一些修改,然后在你自己的本地分支上做一些提交,再拉取遠程倉庫的變更。
git clone //假設成員做兩次修改 git fakeTeamwork 2 //本地提交,生成 C4 git commit //更新 git pulllog
git log查看之前提交的 git 歷史。
merge與rebase區別
優點:
- Rebase 使你的提交樹變得很干凈, 所有的提交都在一條線上
缺點:
- Rebase 修改了提交樹的歷史
比如, 提交 C1 可以被 rebase 到 C3 之后。這看起來 C1 中的工作是在 C3 之后進行的,但實際上是在 C3 之前。
推薦閱讀:git rebase 使用詳解
組合拳
que1:
思路提示:
- 這里共有三個特性分支 —— side1 side2 和 side3
- 我需要將這三分支按順序推送到遠程倉庫
- 因為遠程倉庫已經被更新過了,所以我們還要把那些工作合并過來
que2:
標準答案:
$ git checkout master // git pull 相當于 git fetch + git merge $ git pull $ git merge side1 $ git merge side2 $ git merge side3 $ git pushque3:
當你克隆時, Git 會為遠程倉庫中的每個分支在本地倉庫中創建一個遠程分支(比如 o/master)。然后再創建一個跟蹤遠程倉庫中活動分支的本地分支,默認情況下這個本地分支會被命名為 master。
- pull 操作時, 提交記錄會被先下載到 o/master 上,之后再合并到本地的 master 分支。隱含的合并目標由這個關聯確定的。
- push 操作時, 我們把工作從 master 推到遠程倉庫中的 master 分支(同時會更新遠程分支 o/master) 。這個推送的目的地也是由這種關聯確定的!
拉取遠程分支并創建本地分支
git checkout -b foo o/master使用該方式會在本地新建分支 foo,并自動切換到該本地分支 foo。采用此種方法建立的本地分支會和遠程分支 o/master 建立映射關系。
另一種設置遠程追蹤分支的方法就是使用:git branch -u 命令,執行:
git branch -u o/master foo這樣 foo 就會跟蹤 o/master 了。如果當前就在 foo 分支上, 還可以省略 foo:
git branch -u o/master查看如下案例:
作業:
$ git checkout -b side o/master $ git commit $ git pull --rebase $ git push查看遠程倉庫地址
到達指定項目目錄下,該目錄下包含.git 文件夾。然后打開 git,輸入以下命令:
git remote -v查看/修改用戶名和郵箱地址
查看用戶名和郵箱地址:
$ git config user.name$ git config user.email修改用戶名和郵箱地址:
$ git config --global user.name "username"$ git config --global user.email "email"總結
以上是生活随笔為你收集整理的git按照tag拉取代码_Git实操小课堂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 时间-秒_Python-代
- 下一篇: 0也显示曲线 mpchart_BenQ