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




branch指定 master (11)

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

git push origin sandbox

如果我說

git push origin

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

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

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

git push 
git push origin

上面的origin是一個遙遠的。

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


Answers

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”只會推動我的“當前在”分支。


您可以在.gitconfig更改該默認行為,例如:

[push]
  default = current

要檢查當前設置,請運行:

git config --global --get push.default

(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會推送在origin具有匹配遠程分支的本地分支上的所有改變至於git push

git push <remote> ,其中<remote>是當前分支的遠程(或者源,如果沒有為當前分支配置遠程)。

git-push手冊頁的Examples部分


您可以通過在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

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

git push origin HEAD

(從here拿走)


我更喜歡創建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

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


我只是把它放在我的.gitconfig別名部分,並且喜歡它的工作原理:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

git pub或其他repo與git pub repo-name一起推到當前分支。 可口。


我只是將我的代碼提交給一個分支,並將其推送到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

這裡有一個關於Git Push的非常方便和有用的信息: Git Push:只是提示

git push最常見的用途是將您的本地更改推送到公共上游存儲庫。 假設上游是一個名為“origin”的遠程(如果您的存儲庫是克隆,則為默認遠程名稱),並且要更新到/來自的分支名為“master”(默認分支名稱),則使用: git push origin master

git push origin會將所有本地分支的更改推送到匹配的遠程分支。

git push origin master會將更改從本地主分支推送到遠程主分支。

git push origin master:staging如果它存在, git push origin master:staging會將更改從本地主分支推送到遠程分段分支。


我在這裡看到的所有答案都是有效的,但有一種更清晰的方法來克隆存儲庫並立即拉出所有分支。

克隆存儲庫時,實際下載了分支的所有信息,但隱藏了分支。 隨著命令

$ git branch -a

您可以顯示存儲庫的所有分支,並使用該命令

$ git checkout -b branchname origin/branchname

然後,您可以一次手動“下載”它們。

但是,當你想要克隆一個包含很多分支的repo時,所有上面說明的方式都是冗長乏味的,這是一個更清潔,更快捷的方式,雖然它有點複雜。 您需要三個步驟來完成此任務:

  1. 第一步

在您的計算機上創建一個新的空文件夾,並從存儲庫中克隆.git文件夾的鏡像副本:

$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git

文件夾my_repo_folder中的本地存儲庫仍為空,現在只有一個隱藏的.git文件夾,您可以從終端看到“ls -alt”命令。

  1. 第二步

通過將git配置的布爾值“裸”切換為false,將此存儲庫從空(裸)存儲庫切換到常規存儲庫:

$ git config --bool core.bare false
  1. 第三步

抓取當前文件夾中的所有內容並在本地計算機上創建所有分支,從而使其成為正常的repo。

$ git reset --hard

所以現在你可以輸入命令“git branch”,你可以看到所有的分支都被下載了。

這是您可以快速克隆包含所有分支的git存儲庫的快速方法,但這不是您希望以這種方式為每個項目執行的操作。





git branch git-branch git-push