Git學習整理

之前參照莫煩的Git教程整理過一遍Git總結,后來使用Git的時候發現還是有很多操作一知半解,所以再次梳理下Git使用

安裝Git

windows上使用Git,可以從Git官網直接下載安裝程序,選擇默認安裝即可
安裝完成后,開始菜單-->Git-->Git Bash,打開后會彈出一個命令行窗口,就說明Git安裝成功

  • 安裝完成之后需要進行name和email的配置,更好的記錄每一次修改的修改人,--global這個參數表示這是個全局的配置,這臺機器上的所有Git倉庫都會使用這個配置
git config --global user.name "NAME"
git config --global user.email "email@test.com"

創建Git版本庫

版本庫可以簡單理解為一個目錄,這個目錄下的所有文件都可以被Git管理起來,每個文件的修改刪除,Git都能跟蹤,以便查看修改記錄或還原到某個時刻

  • 要創建一個版本庫,首先選擇一個目錄,也可創建一個空目錄
mkdir learn_git
cd learn_git
pwd
/e/learn_git
  • 通過git init 命令把這個目錄變為git可管理的倉庫
$ git init
Initialized empty Git repository in E:/git_learn/.git/

可以看到創建了一個空的git倉庫,并且當前目錄下多了一個.git目錄這個目錄是git用來跟蹤管理版本庫的

把文件添加到版本庫

在當前目錄下創建一個readme.txt文件,寫入內容

vi readme.txt

Git is a version control system
Git is free software
  • git add命令將文件添加到暫存區
$ git add readme.txt

沒有任何輸出,則表示添加暫存區成功

  • git commit命令將文件從暫存區提交到版本庫
$ git commit -m "wrote a readme file"
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

git commit命令的-m參數后面輸入的是本次提交的說明
git commit命令執行完成輸出會提示1個文件被改動(新創建readme.txt),插入了2行(readme.txt文件有2行)
git commit命令一次可以提交多個文件,可以多次使用git add不同文件

git status

git status命令可以查看當前倉庫的狀態(哪些有修改的,哪些修改文件在暫存區待提交)
修改readme.txt文件內容

$ 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")

輸出信息顯示
在master分支
沒有提交的修改:
使用git add <file>將文件添加到暫存區
使用git checkout -- <file>丟棄當前工作目錄中的修改
被修改文件:readme.txt
還沒有準備提交的修改

git diff

git diff用來查看工作區和暫存區的不同

$ git diff
diff --git a/readme.txt b/readme.txt
index f7249b8..2fdf0c4 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system
+Git is a distributed version control system
 Git is free software

可以看到兩次的不同
-Git is a version control system - 表示刪除了這部分內容
+Git is a distributed version control system + 表示添加了這部分內容

  • git diff --cached file用于暫存區和分支master不同的比較
  • git diff HEAD -- file用于工作區和分支master不同的比較
  • 使用git add添加修改到暫存區,再次使用git status查看版本庫狀態
    $ git add readme.txt
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt

可以看到輸出
在master分支上
將要被提交的修改:
使用git reset HEAD <file>取消已經進入暫存區的文件
修改文件:readme.txt

  • 使用git commit命令提交修改到版本庫,再使用git status查看倉庫狀態
$ git commit -m "add distributed"
[master 015cd95] add distributed
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git status
On branch master
nothing to commit, working directory clean

可以看到輸出當前沒有需要提交的修改,工作目錄是干凈的

git log

使用git log 命令可以顯示之前提交到版本庫的記錄,包括commit的id號、提交人、日期、提交說明

$ git log
commit 13cd2aa93fc97391a81fc28bf5319e86342ee2c1
Author: tyq <email@test.com>
Date:   Thu Jan 4 18:52:53 2018 +0800

    append GPL

commit 015cd9545760909630f59e612020f59d52d8cb76
Author: tyq <email@test.com>
Date:   Thu Jan 4 18:46:38 2018 +0800

    add distributed

commit f5302fbafba412e62b22f7bdae20437cd27a0eac
Author: tyq <email@test.com>
Date:   Thu Jan 4 17:52:44 2018 +0800

    wrote a readme file

如果覺的輸出的內容太多,想要簡潔一些,可以使用命令git log --oneline

$ git log --oneline
13cd2aa append GPL
015cd95 add distributed
f5302fb wrote a readme file

git log --oneline顯示對應提交的id號和說明

回到過去

在GIt中用HEAD表示當前版本也就是commit id為13cd2aa,上個版本表示為HEAD^,上上個版本表示為HEAD^^,依次類推,也可以用commit id號表示對應的版本
想把‘append GPL’回退到‘add distributed’可以使用git reset命令

$ git reset --hard HEAD^
HEAD is now at 015cd95 add distributed

查看readme.txt文件,果然回退到了'add distributed'版本

$ cat readme.txt
Git is a distributed version control system
Git is free software

Git版本的回退速度非常快,因為Git內部有個指向當前版本的指針,當回退版本的時候Git僅僅把HEAD從指向append GPL改為指向add distributed,順便把工作區的文件更新了,所以讓HEAD指向哪個版本號,就把當前版本定位在哪
使用git log --oneline查看當前版本記錄

$ git log --oneline
015cd95 add distributed
f5302fb wrote a readme file

可以看到只顯示了2個版本,現在想要回到append GPL的版本時,可以有2種方式
第一種, 往上翻找到append GPL的commit id號,使用命令git reset --hard id號回到append GPL版本
如果之前的窗口關掉了commit id號往上翻找不到了可以使用下面的方法
第二種,使用git reflog,這個命令用來記錄你的每一次執行的命令

$ git reflog
015cd95 HEAD@{0}: reset: moving to HEAD^
13cd2aa HEAD@{1}: commit: append GPL
015cd95 HEAD@{2}: commit: add distributed
f5302fb HEAD@{3}: commit (initial): wrote a readme file

可以看到append GPL的commit id號為13cd2aa,使用git reset --hard 13cd2aa回到append GPL版本

工作區和暫存區

  • 工作區
    工作區就是電腦里面能看到的目錄,比如之前創建的learn_git文件夾就是一個工作區
  • 版本庫
    工作區中有一個隱藏的.git目錄,這個不算是工作區,而是Git的版本庫
    Git版本庫中存了很多東西,其中最重要的是稱為stage的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針HEAD
    把一個文件向版本庫中添加時,是分兩步執行的
    1.使用git add命令把文件的修改添加進暫存區
    2.使用git commit將暫存區的所有內容提交到當前分支

Git跟蹤管理的是修改

每次修改如果不add到暫存區,就不會加入到commit

撤銷修改

  • 文件未添加到暫存區
    git checkout --file命令用與將文件在工作區的修改撤銷掉
  • 文件添加到暫存區
    git reset HEAD file命令用于將暫存區的文件修改回退到工作區,再使用git checkout --file命令即可將工作區的修改撤銷掉。這里的HEAD是指當前的版本庫,還可以使用git reset 版本號 file回退到某個特定的文件
  • 文件已提交至版本庫,未推送至遠程版本庫
    參照之前的回退版本操作,使用git reset --hard id號命令

刪除文件

  • 刪除未添加到暫存區的文件
    rm file直接刪除即可
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test.txt

nothing added to commit but untracked files present (use "git add" to track)
$ rm test.txt
$ git status
On branch master
nothing to commit, working directory clean

可以看到test.txt已成功刪除

  • 刪除已添加到暫存區的文件,未提交到版本庫
    分兩步進行
    1.rm file刪除工作區文件
    2.git add file將修改添加到暫存區
    這樣就成功刪除了文件
  • 刪除已經提交到版本庫的文件
    1.rm file首先刪除工作區的文件
    2.git add file將工作區的修改添加到暫存區
    3.git commit -m "remove file"將修改提交至版本庫
    上面的1、2兩步可以直接使用git rm file這一條命令代替,git rm表示將工作區和暫存區的文件都刪除掉

添加遠程庫

當本地已經有了一個git倉庫,想要創建一個遠程庫時,可以先關聯,然后進行推送
  • 要關聯一個遠程庫,使用下面的命令
    git remote add origin git@server-name:path/repo-name.git
    添加后遠程庫的名字就叫origin這是Git的默認叫法,也可以改成別的
  • 關聯后使用命令git push -u origin master第一次推送master分支的所有內容,加了-u參數Git不但會把本地的master分支內容推送到遠程新的master分支還會把本地的master分支和遠程的master分支關聯起來,在以后推送或者拉取時就可以簡化命令
    此后就可以每次使用git push origin master推送最新的修改至遠程庫
  • 使用git remote -v命令可以查看本地關聯的遠程倉庫origin的地址
如果從零開始,先創建遠程庫,再從遠程庫進行克隆
  • 創建遠程庫,在github頁面進行創建
  • 使用命令git clone克隆一個本地庫
    git clone git@server-name:path/repo-name.git
    Git支持hhtps、ssh等多種協議

創建與合并分支

Git中的HEAD實際上執行的是當前的分支,每個分支中都有一個指針指向當前的提交

  • 首先創建dev分支,然后切換到dev分支
$ git checkout -b dev
Switched to a new branch 'dev'

git checkout加上-b參數表示創建并切換,相當與以下2條命令

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

然后用git branch命令查看當前分支

$ git branch
* dev
  master

git branch命令會列出所有的分支,當前的分支會用一個*標出
現在可以在dev分支上進行正常的修改提交

$ vi readme.txt
$ git add readme.txt
$ git commit -m "branch test"
[dev 6f978d0] branch test
 1 file changed, 1 insertion(+)

現在dev分支上的工作完成,我們就可以切換回master分支

$ git checkout master
Switched to branch 'master'

切換回master分支后會看到剛才提交的修改不見了,因為剛才的修改在dev分支上,而master分支此刻的提交點并沒有變

  • 現在把dev上的工作成果合并到master
$ git merge dev
Updating eb42341..6f978d0
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到當前分支。合并后查看readme.txt文件可以看到和dev分支上最新提交的是一樣的
上面的輸出中有一行Fast-forward,表示這是合并是“快進模式”,也就是直接把master指向dev的當前提交,所有合并速度非常快

  • 合并后就可以刪除dev分支了
$ git branch -d dev
Deleted branch dev (was 6f978d0).
$ git branch
* master

解決沖突

準備新的feature1分支進行開發

$ git checkout -b feature1
Switched to a new branch 'feature1'

修改readme.txt文件,并提交

$ vi readme.txt
$ git add readme.txt
$ git commit -m "AND simple"
[feature1 029a3b2] AND simple
 1 file changed, 1 insertion(+), 1 deletion(-)

切換到master分支,修改readme.txt并提交

$ git checkout master
Switched to branch 'master'
$ vi readme.txt
$ git add readme.txt
$ git commit -m "& simple"
[master 9243e69] & simple
 1 file changed, 1 insertion(+), 1 deletion(-)
  • 進行合并
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

從輸出可以看到Automatic merge failed; fix conflicts and then commit the result.合并失敗了,Git讓先解決沖突然后在提交結果
使用git status命令也可以告訴我們沖突的文件

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

直接vi查看readme.txt

$ vi readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

可以看到Git用<<<<<< ====== >>>>>>標記出了不同分支的內容

<<<<<<< HEAD
Creating a new branch is quick & simple.

表示當前master分支的內容

Creating a new branch is quick AND simple.
>>>>>>> feature1

表示feature1分支的內容
在此模式下修改這個文件為想要的內容,然后保存再提交

$ git add readme.txt
$ git commit -m "conflict fixed"
[master 7ff0a70] conflict fixed

可以看到輸出提示沖突已解決,查看readme.txt內容為剛剛保存的內容
用帶參數的git log命令可以查看當前的分支合并情況

$ git log --graph --pretty=oneline --abbrev-commit
*   7ff0a70 conflict fixed
|\
| * 029a3b2 AND simple
* | 9243e69 & simple
|/
* 6f978d0 branch test
* eb42341 remove test.txt
* 28abff3 add test.txt
* 665e753 remove test.txt
* 232dc37 add text.txt

最后刪除分支

$ git branch -d feature1
Deleted branch feature1 (was 75a857c).
$ git push origin --delete feature1 #刪除遠程庫上的分支
  • 使用 git branch -D <name>強行刪除一個未合并的分支
$ git branch -d dev  #dev分支未合并,所以刪除失敗
error: The branch 'dev' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev'.
$ git branch -D dev  # 強行刪除
Deleted branch dev (was e32273c).

分支管理策略

通常分支合并時,如果可能,Git會用Fast forword模式,在這種模式下刪除分支,會丟掉分支信息

$ git log --graph --pretty=oneline --abbrev-commit
* 6106360 test fast forword
*   7ff0a70 conflict fixed

像上面的test fast forword不會保留dev分支信息
git merge命令加上--no-ff參數會禁用Fast forword模式,Git會在merge時生成一個新的commit,這樣從分支歷史上就可以看出分支信息

  • 創建一個新的dev分支,修改readme.txt,提交修改內容,切換至master分支
$ git checkout -b dev
Switched to a new branch 'dev'
$ vi readme.txt
$ git add readme.txt
$ git commit -m "test --no--ff"
[dev 8de91d1] test --no--ff
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git checkout master
Switched to branch 'master'

使用git merge --no-ff命令合并

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

這里的-m參數相當與commit 時候的說明。因為會生成一個新的commit所以使用-m參數添加提交說明
使用git log查看提交歷史

$ git log --graph --pretty=oneline --abbrev-commit
*   4286431 merge with no-ff
|\
| * 8de91d1 test --no--ff
|/
* 6106360 test fast forword
*   7ff0a70 conflict fixed

可以看到這里和上一次merge的test fast forword不同,顯示了分支上test--no-ff的提交,并創建了一個新的commit記錄
Fast forword模式相當與直接將master提交指向了dev提交,將HEAD指向master

Git stash

正在dev分支上工作,還沒有提交,突然需要解決線上bug,這個時候就需要將dev分支上的內容儲藏起來,等以后恢復現場再使用,可以使用git stash命令

$ vi readme.txt
$ git status
On branch dev
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")

可以看到當前dev分支正在工作

$ git stash
Saved working directory and index state WIP on dev: 8de91d1 test --no--ff
HEAD is now at 8de91d1 test --no--ff
$ git status
On branch dev
nothing to commit, working directory clean

使用git stash命令將當前工作儲藏起來,可以看到現在當前dev分支是干凈的
使用git stash list命令可以查看儲藏的列表

$ git stash list
stash@{0}: WIP on dev: 8de91d1 test --no--ff

可以看到工作現場還在GIt把它存儲在某個地方了
想要恢復有2中方法
1.使用git stash apply恢復,但是恢復后stash內容不會刪除,需要使用git stash drop來刪除

$ git stash apply
On branch dev
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 stash list
stash@{0}: WIP on dev: 8de91d1 test --no--ff
$ git stash drop
Dropped refs/stash@{0} (e83c20f2d39c1b48e25108923f4f7013e3855ed4)
$ git stash list

2.使用git stash pop恢復的同時把stash的內容也刪了

$ git stash pop
On branch dev
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")
Dropped refs/stash@{0} (f94abd78b7ae06ada2581a2b92e63bc74c1fd164)

可以多次stash,然后使用git stash apply stash@{0},恢復指定的stash

  • 這里說明下為什么要使用git stash,當在dev分支上有沒有提交的內容,直接切換到master時,會發現dev上沒有提交的內容,在master中也會存在dev分支上的修改,所以這時候就需要用stash

git remote

要查看遠程庫的信息,用git remote

$ git remote
origin

可以看到遠程倉庫的默認名稱是origin
git remote -v可以查看更詳細的信息

$ git remote -v
origin  https://github.com/tangxq/test.git (fetch)
origin  https://github.com/tangxq/test.git (push)

上面顯示了可以抓取和推送的遠程地址,如果沒有推送權限就看不到push的地址

推送分支

推送分支,就是把該分支上所有本地提交推送到遠程庫,推送時,要指定本地分支,這樣Git就會把該分支推送到遠程庫對應的遠程分支上
$ git push origin master #推送master分支至遠程庫的master分支上
$ git push origin dev # 推送dev分支到遠程庫dev分支,遠程庫沒有dev分支會自動創建

抓取分支

當clone一個項目時,默認只會clone下來master分支,例如想要抓取遠程庫的dev分支,就必須創建遠程的origindev分支到本地,可以使用如下命令

$ git checkout -b dev origin/dev
Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'

這樣本地創建的dev分支就與遠程庫的dev分支相對應了

多人協作
  • 當在dev分支上工作完成準備推送到遠程dev分支時,可以會出現下面的情況
$ git push origin dev
To https://github.com/tangxq/test.git
 ! [rejected]        dev -> dev (fetch first)
error: failed to push some refs to 'https://github.com/tangxq/test.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

推送失敗,從提示信息可以看到是因為本次提交的推送和遠程庫中的內容有沖突(原因是別的小伙伴修改了同一個文件并且已經提交至遠程dev分支),GIt已經提示我們先用git pull 把最新的提交抓取下來,在本地合并沖突提交,再推送

  • 第一步,先用git pull把最新的提交抓取下來
$ git pull origin dev
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/tangxq/test
 * branch            dev        -> FETCH_HEAD
   ee45e18..ae94d9c  dev        -> origin/dev
Auto-merging test1.txt
CONFLICT (content): Merge conflict in test1.txt
Automatic merge failed; fix conflicts and then commit the result.

這里也可以使用另一種方法,先使用git branch --set-upstream dev origin/dev命令將本地的dev分支與遠程dev分支關聯,然后再使用git pull命令

  • 第二步,合并沖突,并提交至版本庫
    1.首先使用git status查看發生沖突的文件
On branch dev
Your branch and 'origin/dev' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   test1.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        logs/
        test.txt

no changes added to commit (use "git add" and/or "git commit -a")

2.使用vi命令編輯解決沖突
$ vi test1.txt
3.提交修改

$ git add test1.txt
$ git commit -m "merge & fixed test1.txt"
[dev 2cc8eb9] merge & fixed test1.txt
  • 第三步,在用git push命令推送至遠程版本庫
$ git push origin dev
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 410 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/tangxq/test.git
   ae94d9c..2cc8eb9  dev -> dev

標簽管理

發布一個版本時,通常會先在版本庫中打一個標簽(tag),這樣就確定了打標簽時刻的版本,tag相當與是當前commit id的一個指針,是全局的,和分支沒有關系
使用git tag name命令在git中打標簽

$ git branch
* dev
  master
$ git tag v1.0

可以使用git tag命令查看所有標簽

$ git tag
v1.0

默認標簽都是打在最新的commit id上,如果要在指定的commit id上打標簽,使用git tag name id號即可
使用git log命令列出所有的commit id

2cc8eb9 merge & fixed test1.txt
f00abb4 add hehe
ae94d9c edit test1.txt
ee45e18 Merge tag 'v1.0' of https://github.com/xxx/test into dev
454eb54 write dev dev1
64f1c6c add write dev1
e3fef54 add write dev
606b1dc add test1

比如要對add hehe這個commit打tag,使用如下命令即可

$ git tag v0.9 f00abb

使用git tag命令查看tag列表

$ git tag
v0.9
v1.0

標簽不是按照時間順序列出的,而是按照字母順序列出。
可以使用git show tagname查看tag詳細信息

$ git show v0.9
commit f00abb43d5a68dae01b73978657b964353baabb1
Author: tyq <tangyaqiang@huimin100.cn>
Date:   Sat Jan 6 11:22:58 2018 +0800

    add hehe

diff --git a/test1.txt b/test1.txt
index 5ad28e2..844e587 100644
--- a/test1.txt
+++ b/test1.txt
@@ -1 +1,2 @@
-haha
+haha.
+hehe

還可以創建帶有說明的標簽,-a指定標簽名-m指定說明文字

$ git tag -a v0.8 -m "version 0.8 released" ee45e

使用git show tagname命令可以看到文字說明

$ git show v0.8
tag v0.8
Tagger: tyq <tangyaqiang@huimin100.cn>
Date:   Sat Jan 6 14:58:43 2018 +0800

version 0.8 released

commit ee45e18527440d7ba9e72a2ad8240cb80306a4a9
Merge: 454eb54 6229764
Author: tyq <tyq@email.com>
Date:   Thu Jun 29 11:24:57 2017 +0800

    Merge tag 'v1.0' of https://github.com/xxx/test into dev

操作標簽

如果標簽打錯了,也可以刪除

$ git tag -d v0.8
Deleted tag 'v0.8' (was 4d86fe9)

如果想要推送某個標簽到遠程可以使用git push origin tagname

$ git push origin v0.9
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/xxx/test.git
 * [new tag]         v0.9 -> v0.9

或者一次性推送全部尚未推送到遠程的標簽

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 554 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/xxx/test.git
 * [new tag]         v0.2 -> v0.2
 * [new tag]         v0.9 -> v0.9

如果想要拉取遠程庫中的tag,使用git pull

$ git pull
From https://github.com/tangxq/test
 * [new tag]         v1.0       -> v1.0
Already up-to-date.

如果tag已經推送到遠程倉庫刪除,需要2步
1.首先刪除本地的tag

$ git tag -d v0.8
Deleted tag 'v0.8' (was 4d86fe9)

2.刪除遠程倉庫中的tag

$ git push origin :refs/tags/v.08
To https://github.com/tangxq/test.git
 - [deleted]         v0.8
  • git 常用命令
# git 拉取遠程指定的分支并關聯
git checkout -b 本地分支名 origin/遠程分支名
# 更改關聯本地分支和遠程的分支
git branch --set-upstream-to origin/遠程分支名 本地分支名
# 提交當前分支的內容到遠程對應的分支
git push origin HEAD: 遠程分支名
# 強制提交當前分支的內容到遠程對應的分支(慎用)
git push origin HEAD: 遠程分支名 --force
# 撤銷某次操作,此次操作的之前和之后的commit和history都會保留,并且把這次撤銷
git revert HEAD  #撤銷前一次commit
git revert HEAD^  #撤銷前前一次commit
git revert commitId  #依據commitId撤銷commit
# git revert和git reset區別:git revert增加head指針,git reset 修改指針位置到某次commit 
# 指定git賬號clone某個倉庫地址
git clone http://username@xxx.xxx.com/xx-xxx/xxx.git
#撤銷工作區所有文件修改
git checkout -f HEAD
#pull 代碼失敗解決方法,將改的添加到暫存去,然后git stash暫存,此時為一個干凈的空間,然后git pull 拉取
git add *
git stash
git pull
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容