使用git同步所有分支

Gab*_*iel 4 git branch sync github

我从两个主要位置推送代码:我家里的电脑和工作中的笔记本电脑.我使用Github来存储我的回购.

这是一个场景:我在我的PC上做了一些工作,我已经工作了一段时间(在我的电脑和我的笔记本电脑中),并以下列分支结束:

$ git branch
* master
* v123
* test-b
Run Code Online (Sandbox Code Playgroud)

我把它推到了Github.到现在为止还挺好.

现在我在我的笔记本电脑上,这是我在尝试拉动任何东西之前看到的:

$ git branch
* master
* v_123
Run Code Online (Sandbox Code Playgroud)

这是我的笔记本电脑中的旧版本(因为我一直在我的电脑上工作),其中存在以下差异:缺少分支(test-b),另一个已重新命名,或等效删除并重新创建一个新名称(即:v_123现在是v123),并且许多事情可能在所有分支中都发生了变化.

我想将我的所有分支同步到我的笔记本电脑中并正确跟踪它们.我已经看了两个最先进的投票问题,关于分支克隆/取回(如何克隆所有远程分支机构Git中?,如何获取所有的Git分支)和现在我有点失落.

是否有一些易于使用的git sync-branch --all命令可用于将我的笔记本电脑与Github中最新的repo状态同步?

ton*_*ton 37

我想你想要:

git fetch --all -Pp
Run Code Online (Sandbox Code Playgroud)

其中: git fetch从另一个(远程)存储库下载对象和引用

--all获取所有遥控器。

-P删除遥控器上不再存在的任何远程跟踪引用。

-p删除远程上不再存在的所有本地标签。

更多用途git fetch --help

我们有一个类似的命令,仅执行修剪而不获取远程数据:

git remote prune origin
Run Code Online (Sandbox Code Playgroud)

我们还可以设置 git 客户端在每次获取数据时进行远程修剪:

git config --global fetch.prune true
Run Code Online (Sandbox Code Playgroud)


Bre*_* ho 9

不确定,这是你所期望的.

git fetch origin
git reset --hard origin/master
git clean -f -d
Run Code Online (Sandbox Code Playgroud)

以上命令将使远程仓库与本地仓库同步.执行上述命令后,您的本地仓库将类似于远程仓库的镜像.

如果要将更改保留为非暂存文件,请使用--soft而不是--hard.

警告:当您这样做时,所有未跟踪的文件都将消失git clean -f -d.

Lemme知道,如果有任何问题.


Arn*_* VM 5

我有一个类似的问题:

  • 我想一次同步我所有的本地跟踪分支
  • 我希望这个操作是安全的。换句话说,如果发生本地修改或分支分支,警告不要触摸历史(不要篡改未提交的修改)

在搜索了很多简单的解决方案之后,我最终得到了我自己的(不是那么简单)解决方案,基于一系列 git 别名(要添加到.gitconfig文件中的代码):https : //gist.github.com/arnauldvm /dcec7ee043c25dce30dbae1b576f2102

? 这是新代码,尚未经过严格测试。

用法: git sync


一些解释:

tracking = "!f() { git for-each-ref --format '%(refname:short):%(upstream:short)' 'refs/heads' | egrep -v ':$'; }; f"
Run Code Online (Sandbox Code Playgroud)

? 这将检索所有本地跟踪分支和相应的远程分支,以冒号分隔。

is-clean-workdir = "!f() { git diff --stat --exit-code || { echo \"Workdir dirty\"; exit 1; }; }; f"
is-clean-index = "!f() { git diff --stat --cached --exit-code || { echo \"Index dirty\"; exit 2; }; }; f"
is-clean = "!f() { git is-clean-workdir && git is-clean-index; }; f"
Run Code Online (Sandbox Code Playgroud)

? 这些将验证工作目录中没有挂起的更改。

co-merge = "!f() { local=\"$1\"; remote=\"$2\"; git checkout \"$local\"; git merge --ff-only \"$remote\"; }; f"
Run Code Online (Sandbox Code Playgroud)

? 这需要 2 个参数(一个本地分支和一个远程分支),它将检出本地分支并将其与远程分支合并。它用于--ff-only避免创建提交合并?如果发生分支本地分支,它会发出“致命:无法快进,中止”。STDERR 上的消息。

current-branch = rev-parse --abbrev-ref HEAD
Run Code Online (Sandbox Code Playgroud)

? 检索当前签出的分支的名称。最后将用于将工作目录恢复到其初始状态。

sync = "!f() { git is-clean || { echo Aborting sync.; exit 1; }; current=$(git current-branch); git fetch --all; git tracking | while IFS=: read local remote; do echo \"Merging $local with $remote\"; git co-merge \"$local\" \"$remote\"; done 3>&1 1>&2 2>&3 | egrep -i --color 'fatal|$' 3>&1 1>&2 2>&3; git checkout \"$current\"; }; f"
Run Code Online (Sandbox Code Playgroud)

? 这是主要部分。让我们把它分成几个部分:

git is-clean || { echo Aborting sync.; exit 1; }
Run Code Online (Sandbox Code Playgroud)

?? 如果工作目录中有待处理的工作,则中止命令。

current=$(git current-branch)
Run Code Online (Sandbox Code Playgroud)

?? 存储当前签出的分支的名称。

git fetch --all
Run Code Online (Sandbox Code Playgroud)

?? 同步来自所有遥控器 ( --all) 的远程分支。

git tracking | while IFS=: read local remote; do ...
Run Code Online (Sandbox Code Playgroud)

?? 迭代每个本地跟踪分支。

3>&1 1>&2 2>&3 | egrep -i --color 'fatal|$' 3>&1 1>&2 2>&3
Run Code Online (Sandbox Code Playgroud)

?? 突出显示错误(包含“致命”关键字)。“3>&1 1>&2 2>&3”神奇公式交换STDOUT和STDERR,需要能够通过管道将STDERR传递给egrep命令。

git checkout "$current"
Run Code Online (Sandbox Code Playgroud)

?? 将工作目录恢复到其初始状态。