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