track - 沒有指定分支的“git push”的默認行為




git remove branch (8)

git推送會嘗試將所有本地分支推送到遠程服務器,這可能是您不想要的。 我有幾個便利設置來處理這個問題:

別名“gpull”和“gpush”適當:

在我的〜/ .bash_profile中

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

因此,執行“gpush”或“gpull”只會推動我的“當前在”分支。

我使用以下命令推送到我的遠程分支:

git push origin sandbox

如果我說

git push origin

它是否也推動了我其他分支的變化,還是只更新了我目前的分支? 我有三個分支: masterproductionsandbox

git push文檔對此不太清楚,所以我想澄清這一點。

哪些分支和遙控器可以完成以下git push命令的更新?

git push 
git push origin

上面的origin是一個遙遠的。

我明白, git push [remote] [branch]將只將該分支推送到遠程。


(2012年3月)
注意:默認的“ matching ”策略可能會很快改變
(有時在git1.7.10 +之後)

請參閱“ 請討論:當您不說推薦內容時,應該做什麼”git push“?

在當前設置 (即push.default=matching )中, 沒有參數的git push會推送所有本地和遠程存在的具有相同名稱的分支
當開發人員推送到他自己的公共存儲庫時,這通常是合適的,但在使用共享存儲庫時如果不危險,可能會引起混淆。

建議是將默認值更改為' upstream ' ,即只推送當前分支,並將其推到分支git pull將從中拉出。
另一位候選人是' current '; 這只會將當前分支推送到相同名稱的遠程分支。

目前已經討論過的內容可以在這個主題中看到:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

先前的相關討論包括:

要加入討論,請將您的消息發送到:[email protected]


你可以用命令推送當前分支

git push origin HEAD

(從here拿走)


您可以使用push.default為git設置默認行為

git config push.default current

或者如果你有很多存儲庫,並且希望所有的存儲庫都一樣

git config --global push.default current

此設置中的電流意味著默認情況下, 只有在執行git push才會推送當前分支

其他選項是:

  • 沒有:不要推動任何東西
  • 匹配:推送所有匹配分支(默認)
  • 跟踪:將當前分支推送到正在跟踪的任何分支
  • 當前:推送當前分支

更新 - 新的方式來做到這一點

從Git 1.7.11開始,請執行以下操作:

git config --global push.default simple

這是一個引入的新設置,與當前的方式相同,根據傳聞將默認為從v 2.0開始。


您可以通過在git config中設置push.default來控制默認行為。 從git-config(1)文檔中

push.default

定義如果在命令行上沒有給出refspec,遠程沒有配置refspec,並且在命令行上給出的任何選項都沒有暗示refspec,那麼git push應該採取的行動。 可能的值是:

  • nothing :不要推動任何東西

  • matching :推送所有匹配的分支

    所有在兩端具有相同名稱的分支都被認為是匹配的。

    這是Git 1.x中的默認值。

  • upstream :將當前分支推送到其上游分支( tracking是上游的廢棄同義詞)

  • current :將當前分支推送到同名分支

  • simple :(像Git 1.7.11一樣新增)像上游一樣,但如果上游分支的名字與本地名稱不同,則拒絕推送

    這是最安全的選擇,非常適合初學者。

    這將成為Git 2.0中的默認設置。

簡單,當前和上游模式適用於那些在完成工作後想要推出單個分支的人,即使其他分支尚未準備好推出

命令行示例:

查看當前配置:

git config --global push.default

要設置新配置:

git config --global push.default current

我只是將我的代碼提交給一個分支,並將其推送到github,如下所示:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

我已將以下函數添加到我的.bashrc文件中以自動完成這些任務。 它執行git push / git pull +當前分支的名稱。

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}

我更喜歡創建git-XXX腳本,而不是使用別名,所以我可以更容易地控制它們(我們的開發人員在他們的路徑上都有一個特定的源代碼控制目錄)。

這個腳本(稱為git-setpush )會將remote.origin.push值的config值設置為只會推送當前分支的東西:

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

請注意,當我們使用Gerrit ,它會將目標設置為refs/for/XXX以將其推送到評論分支。 它還假定來源是您的遠程名稱。

在檢出分支後調用它

git checkout your-branch
git setpush

它顯然可以適應也做結帳,但我喜歡腳本做一件事,做得很好





git-push