remote - git switch branch




如何在Git中獲取當前分支名稱? (20)

git status會給出分支名稱和更改

我來自Subversion背景,當我有一個分支時,我知道我在處理“這些工作文件指向這個分支”。

但對於Git,我不確定何時編輯NetBeans或Notepad ++中的文件,無論它是綁定到主服務器還是其他分支。

在bash中git沒有問題,它告訴我我在做什麼。


git branch應顯示您的回購的所有本地分支。 星號分支是您當前的分支。


以下shell命令會告訴您當前所在的分支。

git branch | grep ^\*

如果您不想在每次想知道分支並且正在使用Bash時鍵入那麼長的命令,請給該命令一個簡短的別名,例如別名cb ,就像這樣。

alias cb='git branch | grep ^\*'

當你在分支大師,你的提示是$ ,你會得到* master如下。

$ cb
* master

你也有git symbolic-ref HEAD ,它顯示完整的refspec。

在Git v1.8及更高版本中只顯示分支名稱(感謝Greg指出了這一點):

$ git symbolic-ref --short HEAD

在Git v1.7 +上,你也可以這樣做:

$ git rev-parse --abbrev-ref HEAD

如果你在一個分支上,兩者應該給出相同的分支名稱。 如果你在一個孤立的頭上答案不同。

注意:

在較早的客戶端,這似乎工作:

$ git symbolic-ref HEAD | sed -e "s/^refs\/heads\///"

- Darien 26. Mar 2014


使用Mac將其添加到PS1

PS1='\[email protected]\u >`[ -d .git ] && git branch | grep  ^*|cut -d" " -f2`> $ '

在運行上面的命令之前:

運行該命令之後:

不用擔心,如果它不是GIT存儲庫,它將不會顯示錯誤,因為[-d .git]會檢查.git文件夾是否存在。


使用較早的想法; 假設sha1是40個字符; 和追逐引用(是的,應刪除調試打印行:-):

git reflog | awk '
$3 == "checkout:" && (sha == "" || sha == $1 ) {
  from=$(NF - 2)
  to=$NF
  print from, to, length(from) > "/dev/stderr"
  if (length(from) != 40) { print from ; exit; }
  sha=substr(from, 1, 7)
  print sha > "/dev/stderr"
}
'

給出原始輸出:

$ git status
HEAD detached at 147049c
[...]
$ ./gime-branch.sh
a47be8d2167641088b66bf8f5c2bf7d3da0c642c HEAD^ 40
a47be8d
master HEAD^ 6
master


在分離頭上時,返回分支名稱或SHA1:

git rev-parse --abbrev-ref HEAD | grep -v ^HEAD$ || git rev-parse HEAD

這是@ dmaestro12答案的簡短版本,無需標籤支持。


對不起,這是另外一個命令行答案,但是當我發現這個問題時,我正在尋找這些答案,其中許多答案都很有幫助。 我的解決方案是以下bash shell函數:

get_branch () {
    git rev-parse --abbrev-ref HEAD | grep -v HEAD || \
    git describe --exact-match HEAD 2> /dev/null || \
    git rev-parse HEAD
}

這應該總是給我一些既可讀又可直接用作git checkout參數的東西。

  • 在本地分支上: feature/HS-0001
  • 在標記的提交(分離): v3.29.5
  • 在遠程分支上(分離,未標記):SHA1
  • 在任何其他分離的提交上:SHA1

對於我自己的引用(但它可能對其他人有用),我概述了本主題中提到的大多數(基本命令行)技術,每種技術都應用於幾種用例:HEAD(指向):

  • 本地分支(主)
  • 遠程跟踪分支,與本地分支同步(與主服務器相同提交的來源/主服務器)
  • 遠程跟踪分支,與本地分支(origin / feature-foo)不同步
  • 標籤(v1.2.3)
  • 一般脫離頭(以上都不是)

結果:

  • git branch | sed -n '/\* /s///p'
    • 當地分行: master
    • 遠程跟踪分支(同步):( (detached from origin/master)
    • 遠程跟踪分支(不同步):( (detached from origin/feature-foo)
    • 標籤:( (detached from v1.2.3)
    • 一般分離頭:( (detached from 285f294)
  • git status | head -1
    • 本地分支: # On branch master
    • 遠程跟踪分支(同步): # HEAD detached at origin/master
    • 遠程跟踪分支(不同步): # HEAD detached at origin/feature-foo
    • 標籤: # HEAD detached at v1.2.3
    • 一般分離頭部: # HEAD detached at 285f294
  • git describe --all
    • 當地分行: heads/master
    • 遠程追踪分支(同步): heads/master (注意: 不是 remotes/origin/master
    • 遠程追踪分支(不同步): remotes/origin/feature-foo
    • 標籤: v1.2.3
    • 一般分離頭: v1.0.6-5-g2393761
  • cat .git/HEAD
    • 本地分支: ref: refs/heads/master
    • 所有其他用例:相應提交的SHA
  • git rev-parse --abbrev-ref HEAD
    • 當地分行: master
    • 所有其他用例: HEAD
  • git symbolic-ref --short HEAD
    • 當地分行: master
    • 所有其他用例: fatal: ref HEAD is not a symbolic ref

(僅供參考,使用git版本1.8.3.1完成)


您也可以使用GIT_BRANCH變量,如下所示: https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin ://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

git插件設置了幾個可以在腳本中使用的環境變量:

GIT_COMMIT - 當前的SHA

GIT_BRANCH - 當前正在使用的分支的名稱,例如“master”或“origin / foo”

GIT_PREVIOUS_COMMIT - 來自同一分支的先前構建提交的SHA(第一次構建分支中的當前SHA)

GIT_URL - 存儲庫遠程URL

GIT_URL_N - 存在多個遙控器時的存儲庫遠程URL,例如GIT_URL_1,GIT_URL_2

GIT_AUTHOR_EMAIL - 提交者/作者電子郵件

GIT_COMMITTER_EMAIL - 提交者/作者電子郵件


您只需在Linux目錄中輸入命令行(控制台)即可:

$ git status

你會看到一些文字,其中有些類似於:

...
On branch master
...

這意味著你目前在master分支上。 如果此時正在編輯任何文件,並且它位於同一本地存儲庫(包含Git版本控制管理下的文件的本地目錄),則您正在編輯該分支中的文件。


我建議使用這兩個命令中的任何一個。

git branch | grep -e "^*" | cut -d' ' -f 2

要么

git status -uno -bs| cut -d'#' -f 3 | cut -d . -f 1| sed -e 's/^[ \t]//'


我有一個名為git-cbr當前分支 )的簡單腳本,它打印出當前分支名稱。

#!/bin/bash

git branch | grep -e "^*"

我把這個腳本放在一個自定義文件夾( ~/.bin )中。 該文件夾位於$PATH

所以現在當我在一個git倉庫中時,我只需輸入git cbr來打印出當前的分支名稱。

$ git cbr
* master

這是有效的,因為git命令接受它的第一個參數並嘗試運行一個腳本,它的名字是git-arg1 。 例如, git branch嘗試運行一個名為git-branch的腳本等。


找到一個和Oliver Refalo一樣長的命令行解決方案,使用好的aw'awk:

git branch | awk '/^\*/{print $2}'

awk認為這是“在符合正則表達式的行上執行{}的內容”。 默認情況下,它假定用空格分隔的字段,所以你打印第二個。 如果你可以假設只有你的分支的行有*,你可以刪除^。 啊,打高爾夫!


為什麼不使用git-aware shell提示符,它會告訴你當前分支的名稱? git status也有幫助。

如何在contrib/ git中使用__git_ps1 (git version 2.3.0),如__git_ps1輔助函數中所定義的__git_ps1

  1. 首先,如果檢測到正在進行重新折疊 ,則有特殊情況。 Git在rebase過程中使用未命名的分支(分離的HEAD)使其成為原子,並將原始分支保存在別處。

  2. 如果.git/HEAD文件是一個符號鏈接(非常罕見的情況下,從Git的古老歷史中),它使用git symbolic-ref HEAD 2>/dev/null

  3. 否則,它會讀取.git/HEAD文件。 後續步驟取決於其內容:

    • 如果該文件不存在,則不存在當前分支。 這通常發生在資源庫裸露的情況下。

    • 如果它以'ref: '前綴開始,那麼.git/HEAD是symref(符號引用),並且我們在正常的分支上。 去掉這個前綴以得到全名,並去掉refs/heads/來獲取當前分支的簡稱:

      b="${head#ref: }"
      # ...
      b=${b##refs/heads/}
      
    • 如果它不以'ref: ' ,那麼它將分離HEAD(匿名分支),直接指向某個提交。 使用git describe ...以可讀的形式寫入當前提交。

我希望有所幫助。


隨著時間的推移,我們可能會有一長串分支。

雖然其他一些解決方案非常棒,但這是我所做的(從雅各布的回答中簡化):

git branch | grep \*

現在,

git status

工作,但只有當有任何本地更改


#!/bin/bash
function git.branch {
  br=`git branch | grep "*"`
  echo ${br/* /}
}
git.branch

git branch | grep -e "^*" | cut -d' ' -f 2

將只顯示分支名稱


git rev-parse --abbrev-ref HEAD

這將顯示當前分支。

參考:

  • 只顯示Git中的當前分支(2009年9月)






git-branch