我已经开始玩Git并遇到过"上游"和"下游"这两个词.我之前见过这些,但从未完全理解它们.这些术语在SCM(软件配置管理工具)和源代码的上下文中意味着什么?
我在一个有两个分支A和B的项目上工作.我通常在分支A上工作,并从分支B合并东西.对于合并,我通常会这样做:
git merge origin/branchB
Run Code Online (Sandbox Code Playgroud)
但是,我还想保留分支B的本地副本,因为我可能偶尔会检查分支而不先与我的分支A合并.为此,我会这样做:
git checkout branchB
git pull
git checkout branchA
Run Code Online (Sandbox Code Playgroud)
有没有办法在一个命令中执行上述操作,而无需来回切换分支?我应该用git update-ref
它吗?怎么样?
有没有办法将分支合并到另一个分支而不检查任何分支?例如,我检查了分支'master',但我想将branch-a合并到branch-b,而不离开master.
假设我有一个功能分支,在推送我的更改之前我将上游更改合并到其中:
git branch feature1
... [edit my code]
... [commit]
git fetch origin master
git merge fetch_head [or rebase]
... [resolve conflicts]
... [build and test code]
Run Code Online (Sandbox Code Playgroud)
在这一点上,我希望推动我的改变.这样做的正常方法是:
git checkout master [changes a bunch of working tree files]
git merge feature1 [changes the same files right back]
Run Code Online (Sandbox Code Playgroud)
这工作正常,但会使(日期检查)编译器认为一大堆文件是脏的,即使内容相同也需要重建.在这种情况下,有没有办法结帐并使工作树保持不变?
就像是:
git checkout master --merge-branch feature1
Run Code Online (Sandbox Code Playgroud)
编辑:
我只谈论快速合并,根据定义,它不会改变文件的状态.
我有以下场景:
* ab82147 (HEAD, topic) changes
* 8993636 changes
* 82f4426 changes
* 18be5a3 (master) first
Run Code Online (Sandbox Code Playgroud)
我想(非快进)合并topic
成master
.这需要我:
git checkout master
git merge --no-ff topic
但是检查master,然后将主题合并到它会导致git更改我的工作目录(虽然最终结果与检查master之前的结果相同),而我遇到的问题是由于我们项目的大小,构建它需要大约30分钟(使用IncrediBuild)虽然没有真正改变,但它简直无法忍受.
所以我想得到的是以下内容:
* 9075cf4 (HEAD, master) Merge branch 'topic'
|\
| * ab82147 (topic) changes
| * 8993636 changes
| * 82f4426 changes
|/
* 18be5a3 first
Run Code Online (Sandbox Code Playgroud)
没有真正触及工作目录(或至少以某种方式欺骗git).
我正在使用 GitPython 从 Gitlab 服务器克隆存储库。
git.Repo.clone_from(gitlab_ssh_URL, local_path)
Run Code Online (Sandbox Code Playgroud)
后来我有另一个脚本试图更新这个 repo。
try:
my_repo = git.Repo(local_path)
my_repo .remotes.origin.pull()
except (git.exc.InvalidGitRepositoryError, git.exc.NoSuchPathError):
print("Invalid repository: {}".format(local_path)
Run Code Online (Sandbox Code Playgroud)
这很好用,除非我在中间结帐这样的标签:
tag_id = choose_tag() # Return the position of an existing tag in my_repo.tags
my_repo .head.reference = my_repo.tags[tag_id]
my_repo .head.reset(index=True, working_tree=True)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我在拉取时收到 GitCommandError:
Run Code Online (Sandbox Code Playgroud)git.exc.GitCommandError: 'git pull -v origin' returned with exit code 1
我已经阅读了两次文档,但我不知道问题出在哪里。特别是因为如果我尝试使用像 SourceTree 这样的专用工具来拉这个 repo,它可以正常工作而不会出现错误或警告。我不明白即使使用分离的 HEAD 签出标记版本的事实如何阻止我拉。
编辑:作为建议,我试图查看 exception.stdout 和 exception.sterr,这里没有任何用处(分别是 b'' 和 None)。这就是为什么我很难理解出了什么问题。
git ×6
git-checkout ×2
git-merge ×2
definition ×1
git-pull ×1
gitpython ×1
python ×1
terminology ×1
versioning ×1