日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Git workflow

發(fā)布時間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Git workflow 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Git workflow

大神鎮(zhèn)樓:

這人不用說,應(yīng)該都認識,他基本干了兩件事,一個是Linux,一個就是git。每一件事,都在IT史上創(chuàng)建了一個巨大的Tag。

Git是什么

Git能干什么?

Git用來做版本控制,這就好比當初在小日本的公司,每次修改文件,都需要在文件第一頁新增修改履歷,詳細記錄修改內(nèi)容,如果多人同時操作,你可以想象下維護的成本有多高。基本每天就在整理這些破事。

所以說,版本控制是項目開發(fā)的重中之重。那么問題來了,版本控制哪家強?一句話,Git是目前世界上最先進的分布式版本控制系統(tǒng)(沒有之一)。其實也可以把分布式三個字去掉。

集中式版本控制

集中式的版本控制工具以SVN為代表,他有一個中央服務(wù)器,控制著所有的版本管理,其它所有的終端,可以對這個中央庫進行操作,中央庫保證版本的唯一性。

這樣有一個非常不好的地方,就是如果中央服務(wù)器被天災(zāi)軍團攻陷了,那么整個版本就gg了。因為終端只能對一部分代碼進行修改,獲取各種信息,需要不斷與中央服務(wù)器通信。

  • 容災(zāi)性差
  • 通信頻繁
  • 分布式版本控制

    分布式版本控制的典型,就是Git,它跟集中式的最大區(qū)別就是它的終端可以獲取到中央服務(wù)器的完整信息,就好像做了一個完整的鏡像,這樣,我可以在終端做各種操作、獲取各種信息而不需要與服務(wù)器通信,同時,就算服務(wù)器被炸,各個終端還有完整的備份。分布式的思路,在版本控制上,具有得天獨厚的優(yōu)勢,當然,這只是git優(yōu)勢的冰山一角。

    Git安裝與配置

    安裝

    Git的安裝就不解釋了,相信程序猿都有能力獨立解決這樣一個問題,Linux和Mac下基本都已經(jīng)自帶Git了,window,建議不要用Git了,命令行實在是受不了。

    配置

    在終端輸入:

    ~ git --version git version 1.8.4

    來查看當前Git的版本,同時,輸入:

    ~ git config --list --global user.name=xuyisheng user.email=xuyisheng@hujiang.com push.default=current

    或者:

    ~ git config user.name xuyisheng

    用來查看當前的配置信息,如果是新安裝的,那么需要對global信息進行配置。配置的方法有兩種,一個個變量配置,或者一起配置:

    單獨配置:

    ~ git config --global user.name xys

    一起配置:

    ~ git config --global --add user.name xys

    增加多個鍵值對

    刪除配置

    ~ git config --global --unset user.name xys

    配置別名

    這個功能在shell中是很常用的。我們可以做一些別名來取代比較復雜的指令。
    比如:

    git config --global alias.st status

    我們使用st來取代status。

    附上一個比較吊的:

    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

    PS:用git log –graph命令可以看到分支合并圖。

    配置文件

    git的配置文件其實我們是可以找到的,就在.git目錄下:

    testGit git:(master) ls -a . .. .git README.txttestGit git:(master) cd .git.git git:(master) ls HEAD description index logs packed-refs config hooks info objects refs.git git:(master)

    我們打開config文件:

    [core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = trueignorecase = trueprecomposeunicode = false [remote "origin"]url = git@github.com:xuyisheng/testGit.gitfetch = +refs/heads/*:refs/remotes/origin/* [branch "master"]remote = originmerge = refs/heads/master [branch "dev"]remote = originmerge = refs/heads/dev

    這里就是我們所有的配置了。

    創(chuàng)建Git倉庫

    版本控制就是為了管理代碼,代碼就要放在倉庫中。創(chuàng)建倉庫有二種方法:

    Git init

    MyWork mkdir gitTestMyWork cd gitTestgitTest git init Initialized empty Git repository in /Users/hj/Downloads/MyWork/gitTest/.git/gitTest git:(master)

    創(chuàng)建一個目錄,并cd到目錄下,通過調(diào)用git init來將現(xiàn)有目錄初始化為git倉庫,或者直接在git init后面跟上目錄名,同樣也可以創(chuàng)建一個新的倉庫。

    git clone

    git clone用于clone一個遠程倉庫到本地,這個我們后面再將。

    創(chuàng)建好倉庫后,目錄下會生成一個.git的隱藏文件夾,這里就是所有的版本記錄,默認不要對這個文件夾進行修改。

    提交修改

    add && commit

    在倉庫中,我們創(chuàng)建代碼,并將其提交:

    gitTest git:(master) touch README.txtgitTest git:(master) open README.txtgitTest git:(master) git add README.txtgitTest git:(master) git commit -m "add readme" [master (root-commit) c19081b] add readme1 file changed, 1 insertion(+)create mode 100644 README.txt

    我們創(chuàng)建了一個README文件,并通過git add <文件名>的方式進行add操作,最后通過git commit操作進行提交,-m參數(shù),指定了提交的說明。

    這兩個命令應(yīng)該是最常使用的git命令。

    查看修改

    在版本控制中,非常核心的一點,就是需要指定,我們做了哪些修改,比如之前我們創(chuàng)建了一個README文件,并在里面寫了一句話:
    this is readme。

    下面我們修改這個文件:
    this is readme,modify。

    接下來,我們使用git status命令來查看當前git倉庫哪些內(nèi)容被修改了:

    gitTest git:(master) git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README.txt # no changes added to commit (use "git add" and/or "git commit -a")

    我們可以發(fā)現(xiàn),git提示我們:
    modified: README.txt,更進一步,我們可以使用git diff命令來查看具體的修改:

    diff --git a/README.txt b/README.txt index 2744f40..f312f1a 100644 --- a/README.txt +++ b/README.txt @@ -1 +1 @@ -this is readme \ No newline at end of file +this is readme, modify \ No newline at end of file (END)

    這樣就查看了具體的修改。

    下面我們繼續(xù)add、commit:

    gitTest git:(master) git add README.txtgitTest git:(master) git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: README.txt #gitTest git:(master) git commit -m "modify readme" [master 1629cdc] modify readme1 file changed, 1 insertion(+), 1 deletion(-)gitTest git:(master) git status # On branch master nothing to commit, working directory clean

    add和commit之后,我們都使用status來查看下狀態(tài),可以發(fā)現(xiàn),在commit之后,git提示我們,工作區(qū)是干凈的。

    版本記錄

    在項目中,一個倉庫通常可能有非常多次的add、commit過程,這些記錄都會被記錄下來,我們可以使用git log來查看這些記錄:

    commit 1629cdcf2307bf26c0c5467e10035c2bd751e9d0 Author: xuyisheng <xuyisheng@hujiang.com> Date: Sun Jun 28 14:45:14 2015 +0800modify readmecommit c19081b6a48bcd6fb243560dafc7a35ae5e74765 Author: xuyisheng <xuyisheng@hujiang.com> Date: Sun Jun 28 14:35:00 2015 +0800add readme (END)

    每條記錄都對應(yīng)一個commit id,這是一個40個16進制的sha-1 hash code。用來唯一標識一個commit。

    同時,我們也可以使用gitk命令來查看圖形化的log記錄:

    git會自動將commit串成一個時間線。每個點,就代表一個commit。點擊這些點,就可以看見相應(yīng)的修改信息。

    工作區(qū)與暫存區(qū)

    Git通常是工作在三個區(qū)域上:

  • 工作區(qū)
  • 暫存區(qū)
  • 歷史區(qū)
  • 其中工作區(qū)就是我們平時工作、修改代碼的區(qū)域,而歷史區(qū),用來保存各個版本,而暫存區(qū),則是Git的核心所在。

    暫存區(qū)保存在我們前面講的那個.git的隱藏文件夾中,是一個叫index的文件。

    當我們向Git倉庫提交代碼的時候。add操作實際上是將修改記錄到暫存區(qū),我們來看gitk:

    可以發(fā)現(xiàn),我們在本地已經(jīng)生成了一個記錄,但是還沒有commit,所以當前HEAD并沒有指向我們的修改,修改還保存在暫存區(qū)。

    當我們commit之后,再看gitk:

    這時候,HEAD就已經(jīng)移到了我們的修改上,也就是說,我們的提交生成了一個新的commit。git commit操作就是將暫存區(qū)的內(nèi)容全部提交。如果內(nèi)容不add到暫存區(qū),那么commit就不會提交修改內(nèi)容。

    PS 這里需要說明一個概念,git管理的是修改,而不是文件,每個sha-1的值,也是根據(jù)內(nèi)容計算出來的。

    版本回退

    如果這個世界一直只需要git add、commit,就不會有這么多的問題了,但是,愿望是美好的,現(xiàn)實是殘酷的。如何處理版本的回退和修改,是使用git非常重要的一步。

    checkout && reset

    我們來考慮幾種情況:

  • 文件已經(jīng)修改,但是還沒有g(shù)it add
  • 文件已經(jīng)add到暫存區(qū),又作了修改
  • 文件的修改已經(jīng)add到了暫存區(qū)
  • 分別執(zhí)行以下操作:

    gitTest git:(master) git checkout -- README.txt
  • 修改被刪除,完全還原到上次commit的狀態(tài),也就是服務(wù)器版本
  • 最后的修改被刪除,還原到上次add的狀態(tài),也就是修改前的暫存區(qū)狀態(tài)
  • 總的來說,就是還原到上次add、commit的狀態(tài)。

    而對于第三種情況,我們可以使用git reset:

    gitTest git:(master) git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: README.txt #gitTest git:(master) git reset HEAD README.txt Unstaged changes after reset: M README.txtgitTest git:(master) git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README.txt # no changes added to commit (use "git add" and/or "git commit -a")

    通過git reset HEAD README.txt,我們就把暫存區(qū)的文件清除了,這樣,在本地就是add前的狀態(tài),通過checkout操作,就可以進行修改回退了。

    PS : git checkout其實是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除

    回退版本

    當我們的倉庫有了大量的提交的時候,我們可以通過git log來查看(可以指定 –pretty=oneline 來優(yōu)化顯示效果)。

    e7ae095cafc8ddc5fda5a5d8b23d0bcaaf74ac39 modify again 5427c66703abfeaba3706f938317251ef2567e8b delete test.txt 08098a21a918cfbd6377fc7a03a08cac0e6bcef6 add new file b687b06fbb66da68bf8e0616c8049f194f03a062 e 8038c502e6f5cbf34c8096eb27feec682b75410b update 34ad1c36b97f090fdf3191f51e149b404c86e72f modify again 1629cdcf2307bf26c0c5467e10035c2bd751e9d0 modify readme c19081b6a48bcd6fb243560dafc7a35ae5e74765 add readme

    那么我們?nèi)绻赝说街付ò姹灸?#xff1f;在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本就不要這樣寫了,寫成HEAD~100即可。

    下面我們就可以回退了:

    testGit git:(master) git reset --hard HEAD^ HEAD is now at 5427c66 delete test.txt

    要回退到哪個版本,只要HEAD寫對就OK了。你可以寫commit id,也可以HEAD^,也可以HEAD^^。

    前進版本

    有時候,如果我們回退到了舊的版本,但是卻后悔了,想回到后面某個新的版本,但這個時候,我的commit id已經(jīng)忘了,怎么辦呢?
    沒事,通過這個指令:

    5427c66 HEAD@{0}: reset: moving to HEAD^ e7ae095 HEAD@{1}: checkout: moving from dev to master 7986a59 HEAD@{2}: checkout: moving from master to dev e7ae095 HEAD@{3}: checkout: moving from dev to master 7986a59 HEAD@{4}: checkout: moving from 7986a59bd8683acb560e56ff222324cd49edb5e5 to dev 7986a59 HEAD@{5}: checkout: moving from master to origin/dev e7ae095 HEAD@{6}: clone: from git@github.com:xuyisheng/testGit.git

    這樣我們就可以找到commit id用來還原了。

    git reflog記錄的就是你的操作歷史。

    文件操作

    git rm

    如果我們要刪除git倉庫中的文件,我們要怎么做呢?

    我們創(chuàng)建一個新的文件并提交,再刪除這個文件:

    gitTest git:(master) rm test.txtgitTest git:(master) git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: test.txt # no changes added to commit (use "git add" and/or "git commit -a")

    git提示我們delete一個文件,這時候你可以選擇:

    gitTest git:(master) git checkout test.txt

    這樣就撤銷了刪除操作,或者使用:

    gitTest git:(master) git rm test.txt rm 'test.txt'gitTest git:(master) git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: test.txt #gitTest git:(master) git commit -m "delete test.txt" [master 5427c66] delete test.txt1 file changed, 0 insertions(+), 0 deletions(-)delete mode 100644 test.txt

    通過git rm指令,刪除文件,最后提交修改,就真實的刪除了文件。

    文件暫存

    這里的暫存不是前面說的暫存區(qū),而是只一次備份與恢復操作。舉個例子,當前我們在dev分支上進行一個新功能的開發(fā),但是開發(fā)到一半,測試提了一個issue,這時候,我們需要創(chuàng)建一個issue分支來修改這個bug,但是,當前dev分支是不干凈的,新功能開發(fā)到一半,直接從dev上拉分支,代碼是不完善的,可能會編譯不過。
    so,你可以使用:

    git stash

    指令來將當前修改暫存,這樣就可以切換到其他分支或者就在當前干凈的分支上checkout了。
    比如你checkout了一個issue分支,修改了bug,使用git merge合并到了master分支,刪除issue分支,切換到dev分支,想繼續(xù)之前的新功能開發(fā)。
    這時候,就需要恢復現(xiàn)場了:

    首先,通過:

    git stash list

    我們可以查看當前暫存的內(nèi)容記錄。

    然后,通過git stash apply或者git stash pop來進行恢復,它們的區(qū)別是,前者不會刪除記錄(當然你可以使用git stash drop來刪除),而后者會。

    遠程倉庫

    既然git是分布式的倉庫管理,那么我們肯定是需要多臺服務(wù)器進行各種操作的,一般在開發(fā)中,我們會用一臺電腦做中央服務(wù)器,各個終端從中央服務(wù)器拉取代碼,提交修改。

    那么我們?nèi)绾稳ゴ罱ㄒ粋€git遠程服務(wù)器呢,答案是不要搭建,個人開發(fā)者可以通過github來獲取免費的遠程git服務(wù)器,或者是國內(nèi)的開源中國之類的,同樣也提供免費的git服務(wù)器,而對于企業(yè)用戶,可以通過gitlab來獲取git遠程服務(wù)器。

    身份認證

    當本地git倉庫與git遠程倉庫通信的時候,需要進行SSH身份認證。

    打開根目錄下的.ssh目錄:

    ~ cd .ssh.ssh ll total 40 -rw------- 1 xys staff 1.7K 5 15 23:53 github_rsa -rw-r--r-- 1 xys staff 402B 5 15 23:53 github_rsa.pub -rw------- 1 xys staff 1.6K 5 15 09:38 id_rsa -rw-r--r-- 1 xys staff 409B 5 15 09:42 id_rsa.pub -rw-r--r-- 1 xys staff 2.0K 6 3 13:34 known_hosts

    如果沒有id_rsa和id_rsa.pub這兩個文件,就通過如下的命令生成:

    ssh-keygen -t rsa -C "youremail@example.com"

    id_rsa和id_rsa.pub這兩個文件,就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,用在github上表明身份。

    在github的ssh key中增加剛剛生成的key:

    同步協(xié)作

    現(xiàn)在你在本地建立了git倉庫,想與遠程git倉庫同步,這樣github的遠程倉庫可以作為你本地的備份,也可以讓其他人進行協(xié)同工作。

    我們先在github上創(chuàng)建一個repo(倉庫):

    創(chuàng)建之后,github給我們提示:

    github告訴了我們?nèi)绾卧诒镜貏?chuàng)建一個新的repo或者將既存的repo提交到遠程git。

    由于我們已經(jīng)有了本地的git,所以,安裝提示:

    gitTest git:(master) git remote add origin git@github.com:xuyisheng/testGit.gitgitTest git:(master) git push -u origin master Counting objects: 18, done. Delta compression using up to 4 threads. Compressing objects: 100% (8/8), done. Writing objects: 100% (18/18), 1.39 KiB | 0 bytes/s, done. Total 18 (delta 1), reused 0 (delta 0) To git@github.com:xuyisheng/testGit.git* [new branch] master -> master Branch master set up to track remote branch master from origin.

    現(xiàn)在我們再看github上的倉庫:

    README已經(jīng)提交上去了。

    git remote add origin git@github.com:xuyisheng/testGit.git這條指令中的origin,就是遠程倉庫的名字,你也可以叫別的,但是默認遠程倉庫都叫做origin,便于區(qū)分。

    PS: 這里還需要注意下的是git push的-u參數(shù),加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關(guān)聯(lián)起來。不過后面的push就不需要這個參數(shù)了。

    之后我們再做修改:

    gitTest git:(master) git add README.txtgitTest git:(master) git commit -m "modify again" [master e7ae095] modify again1 file changed, 2 insertions(+), 1 deletion(-)gitTest git:(master) git push Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 285 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To git@github.com:xuyisheng/testGit.git5427c66..e7ae095 master -> master

    可以直接使用git push或者git push origin master來指定倉庫和分支名。

    clone遠程倉庫

    記得我們之前說的,創(chuàng)建本地倉庫的幾種方式,其中有一種是clone:

    我們可以通過git clone指令來clone一個遠程倉庫:

    下面就顯示了遠程倉庫的地址,一般我們使用SSH的方式,當然,也可以使用其他方式,然并卵。

    PS: 使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內(nèi)部就無法使用ssh協(xié)議而只能用https。

    直接使用:

    MyWork git clone git@github.com:xuyisheng/testGit.git Cloning into 'testGit'... remote: Counting objects: 21, done. remote: Compressing objects: 100% (9/9), done. remote: Total 21 (delta 1), reused 21 (delta 1), pack-reused 0 Receiving objects: 100% (21/21), done. Resolving deltas: 100% (1/1), done. Checking connectivity... done

    分支管理

    個人認為,創(chuàng)建分支是git最大的魅力。
    git中的分支就好像現(xiàn)在的平行宇宙,不同的分支互不干擾,相互獨立,你就像一個上帝一樣,可以隨時對任意一個分支進行操作,可以今天去這個branch玩,明天去另一個branch,玩膩了,再把兩個分支合并,一起玩。

    舉個比較恰當?shù)睦?#xff0c;我現(xiàn)在要開發(fā)一個新功能,需要3個月的時間,但是我不能每天都把未完成的代碼提交到大家都在用的分支上,這樣人家拉取了我的代碼就無法正常工作了,但是我又不能新建一個倉庫,這也太浪費了,所以我可以新建一個分支,在這個分支上開發(fā)我的功能,同時能夠備份我的代碼,當開發(fā)完畢后,直接合并分支,整個新功能就一下子加入了大家的分支。

    創(chuàng)建分支

    你的每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。不創(chuàng)建分支時,只有一條時間線,在Git里,這個分支叫主分支,即master分支。HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。

    這里的時間線就看的非常清楚了。

    我們通過如下指令來創(chuàng)建分支:

    gitTest git:(master) git checkout -b dev Switched to a new branch 'dev'gitTest git:(dev)

    -b參數(shù)代表創(chuàng)建并切換到該分支,相當于:

    $ git branch dev $ git checkout dev Switched to branch 'dev'

    不加-b參數(shù)就是直接切換到已知分支了。

    查看分支

    通過git branch指令可以列出當前所有分支:

    gitTest git:(dev) git branch * devmaster

    當前分支上會多一個*

    合并分支

    切換到dev分支后,我們進行修改,add并commit:

    此時我們再切換到master分支,再查看當前修改,你會發(fā)現(xiàn),dev分支上做的修改這里都沒有生效。必須的,不然平行宇宙就不平行了。我們通過如下指令來進行分支的合并:

    gitTest git:(master) git merge dev Updating e7ae095..7986a59 Fast-forwardREADME.txt | 3 ++-1 file changed, 2 insertions(+), 1 deletion(-)

    這樣再查看master分支下的文件,dev上的修改就有了。

    刪除分支

    使用完畢后,我們不再需要這個分支了,所以,放心的刪除吧:

    gitTest git:(master) git branch -d dev Deleted branch dev (was 7986a59).gitTest git:(master) git branch * master

    PS : 當分支還沒有被合并的時候,如果刪除分支,git會提示:
    error: The branch ‘feature-vulcan’ is not fully merged.
    If you are sure you want to delete it, run ‘git branch -D dev.
    也就是提示我們使用-D參數(shù)來進行強行刪除。

    看完分支的操作,有人可能會問,創(chuàng)建這么多分支,git會不會很累,當然不會,git并不是創(chuàng)建整個文件的備份到各個分支,而是創(chuàng)建一個指針指向不同的分支而已。切換分支,創(chuàng)建分支,都只是改變指針指向的位置。

    分支是非常好的團體協(xié)作方式,一個項目中通常會有一個master分支來進行發(fā)布管理,一個dev分支來進行開發(fā),而不同的開發(fā)者checkout出dev分支來進行開發(fā),merge自己的分支到dev,當有issue或者新需求的時候,checkout分支進行修改,可以保證主分支的安全,即使修改取消,也不會影響主分支。

    查看遠程分支

    當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應(yīng)起來了,并且,遠程倉庫的默認名稱是origin。
    通過如下指令,我們可以查看遠程分支:

    gitTest git:(master) git remote origin

    或者:

    gitTest git:(master) git remote -v origin git@github.com:xuyisheng/testGit.git (fetch) origin git@github.com:xuyisheng/testGit.git (push)

    來顯示更詳細的信息。

    推送分支

    要把本地創(chuàng)建的分支同步到遠程倉庫上,我們可以使用:

    gitTest git:(master) git checkout -b dev Switched to a new branch 'dev'gitTest git:(dev) git push origin dev Everything up-to-date

    這樣就把一個dev分支推送到了遠程倉庫origin中。

    抓取遠程分支

    當我們將遠程倉庫clone到本地后即使遠程倉庫有多個分支,但實際上,本地只有一個分支——master。

    MyWork git clone git@github.com:xuyisheng/testGit.git Cloning into 'testGit'... remote: Counting objects: 24, done. remote: Compressing objects: 100% (11/11), done. remote: Total 24 (delta 2), reused 23 (delta 1), pack-reused 0 Receiving objects: 100% (24/24), done. Resolving deltas: 100% (2/2), done. Checking connectivity... doneMyWork cd testGittestGit git:(master) git branch * master

    現(xiàn)在,我要在dev分支上開發(fā),就必須創(chuàng)建遠程origin的dev分支到本地,用這個命令創(chuàng)建本地dev分支:

    testGit git:(master) git checkout -b dev origin/dev Branch dev set up to track remote branch dev from origin. Switched to a new branch 'dev'testGit git:(dev)

    這樣就把本地創(chuàng)建的dev分支與遠程的dev分支關(guān)聯(lián)了。
    后面你可以使用git push origin dev繼續(xù)提交代碼到遠程的dev分支。

    這種情況下,如果其他人也提交了到dev分支,那么你的提交就會與他的提交沖突,因此,你需要使用git pull先將遠程修改拉取下來,git會自動幫你在本地進行merge,如果沒有沖突,這時候再提交,就OK了,如果有沖突,那么必須手動解除沖突再提交。

    Tag

    Tag的概念非常類似于branch。但是branch是可以不斷改變、merge的,Tag不行,Tag可以認為是一個快照,用于記錄某個commit點的歷史快照。

    創(chuàng)建標簽

    非常簡單:

    testGit git:(master) git tag version1

    默認Tag會打在最后的提交上。但是你也可以通過commit id來指定要打的地方。

    testGit git:(master) git tag version0 b687b06fbb66da68bf8e0616c8049f194f03a062testGit git:(master) git tag version0 version1

    PS : 實際上commit id不需要寫很長,通過前6、7位,git就可以查找到相應(yīng)的id了。

    還可以創(chuàng)建帶有說明的標簽,用-a指定標簽名,-m指定說明文字:

    git tag -a v1 -m "version1" b687b06fbb66da68bf8e0616c8049f194f03a062

    通過如下指令來查看詳細信息:

    git show <tagname>

    查看標簽

    testGit git:(master) git tag version1

    刪除標簽

    -d參數(shù)就可以了,與branch類似。

    testGit git:(master) git tag version0 version1testGit git:(master) git tag -d version0 Deleted tag 'version0' (was b687b06)testGit git:(master) git tag version1

    推送到遠程

    將本地tag推送到遠程參考上:

    testGit git:(master) git push origin version0 Total 0 (delta 0), reused 0 (delta 0) To git@github.com:xuyisheng/testGit.git* [new tag] version0 -> version0

    或者:

    testGit git:(master) git push origin --tags Total 0 (delta 0), reused 0 (delta 0) To git@github.com:xuyisheng/testGit.git* [new tag] version1 -> version1

    來push所有的tag。

    刪除遠程Tag

    當Tag已經(jīng)push到遠程倉庫后,我們要刪除這個Tag,首先需要先刪除本地Tag:

    testGit git:(master) git tag -d version0 Deleted tag 'version0' (was b687b06)

    再push到遠程,帶指令有所不同:

    testGit git:(master) git push origin :refs/tags/version0 To git@github.com:xuyisheng/testGit.git- [deleted] version0

    以上。

    學完這些,對付基本的Git使用,就沒什么問題了,后面會再出一篇Git workflow plus,介紹一下Git的高級 操作。

    總結(jié)

    以上是生活随笔為你收集整理的Git workflow的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲av无码久久精品色欲 | 国产在线拍揄自揄拍无码视频 | 亚洲欧美伊人 | 国产福利午夜 | 美女扒开腿让男人操 | 亚洲永久精品一区二区 | www.操.com| 大地资源影视在线播放观看高清视频 | 欧美性极品少妇xxxx | 中文字幕日韩欧美在线 | 中文字幕午夜 | 黄色的网站免费观看 | 久久99精品波多结衣一区 | 麻豆一区产品精品蜜桃的特点 | 波多野结衣av在线播放 | 综合色在线观看 | 日韩欧美国产成人 | 激情久久网| 久草综合在线观看 | 一本久道综合色婷婷五月 | 国产女人叫床高潮大片免费 | 1024手机看片国产 | 一区二区国产欧美 | 正在播放经典国语对白 | 天天草影院 | 超碰pron| h片观看| 日韩av综合在线 | 五月婷婷激情小说 | 欧美精品一区二区在线播放 | 国产精品久久精品三级 | aa成人 | 国产精品自在线 | 97色爱| 亚洲啪 | 亚洲精品影片 | 亚洲国产综合av | 日韩精品久久久久 | 日韩色影院 | 奇米色影视 | 男人天堂欧美 | 国产在线免费视频 | 欧美嫩草影院 | 激情网五月天 | 日韩黄色免费电影 | 免费毛片基地 | 国产乱人伦 | 清清草免费视频 | 免费看黄色一级大片 | 欧美天堂在线观看 | 光棍影院av| 肉色超薄丝袜脚交69xx | 欧美在线 | 亚洲 | 午夜av中文字幕 | v8888av| 五月天黄色小说 | 精品视频在线免费看 | 日韩有码av | 免费看成人av | 国产污视频在线看 | 一本色道久久综合亚洲精品图片 | 911香蕉 | 综合色网站 | 国产毛片自拍 | 少妇又色又紧又大爽又刺激 | 天天天色综合 | 成人永久视频 | 337p嫩模大胆色肉噜噜噜 | 日本少妇xxxx动漫 | 久久久国产精品一区 | 中文字幕视频一区 | 东京av男人的天堂 | 超碰97av | 国产三级在线播放 | 亚洲一区二区麻豆 | 午夜少妇久久久久久久久 | 国产精品大片 | www.亚洲天堂 | 97超碰福利 | 天天夜碰日日摸日日澡性色av | 伊久久 | 日韩精彩视频 | 免费色片 | 超碰人操 | 免费国产黄色 | 日本一级黄色 | 天堂影院一区二区 | 久久艹在线 | 亚洲激情偷拍 | 国产资源精品 | 久久精品色妇熟妇丰满人妻 | 毛片999| 国产在线观看黄色 | 婷婷伊人网 | 日韩综合网站 | 中文字幕亚洲无线码在线一区 | 国产一区二区三区久久久 | 欧美中出 | 亚洲精品成 |