欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

与远程仓库保持同步

程序员文章站 2022-05-13 18:54:22
...

创建 Pull Request

Pull Request拉取请求)是向初始源仓库的维护者发出的请求,以让其将你在他们项目的 fork 上所做的更改应用在他们的项目中。你请求他们拉取你做的更改。你需要完成一些操作:

  • 你必须 fork 源仓库
  • 将你的 fork 克隆到你的计算机
  • 进行一些 commit(最好是在特性分支上!)
  • 将 commit 推送回你的 fork
  • 创建一个新的 Pull Request,并选择包含你的新 commit 的分支

Pull Request 操作过程

一个属于其它开发者的仓库,我们决定 fork 它,创建的是完全相同的副本,因此这两个仓库(OriginalForked)将具有完全相同的 commit,它们的分支也会指向相同的 commit。

与远程仓库保持同步

要创建 Pull Request 我们需要在我们的 fork 副本中添加新的 commit,因此将我们的 fork 副本克隆到本地机器上。

与远程仓库保持同步

我们创建一个 BUGFIX 分支并提交几个 commit 来修复错误,然后将 BUGFIX 分支推送到我们的 fork 副本上,以让这些新的 commit 出现在远程仓库上。我们通过更改推送至我们的 fork 副本上,做好了 Pull Request 的所有准备工作。

与远程仓库保持同步

现在我们将真正创建 Pull Request,稍后说明如何在 GitHub 上执行这一操作。如果 Pull request 被原始仓库的维护者接受了,commit 将被添加到他们的仓库中。创建一个合并 commit 以将我们的新 commit 与他们的现有 commit 合并。他们的 master 分支将使指针移动到这个新的合并 commit 上。

与远程仓库保持同步

创建 Pull request 过程

这时我想把我对这个项目的更改添加到她的项目中,就需要使用 pull request(拉取请求)功能,点击 GitHub fork 的仓库的页面,点击 New pull request 按钮,发送一个新的 pull request。这里显示的是比较我的项目仓库中的 master 分支和原项目仓库中的 master 分支,我们切换我们刚刚推送上来的新特性分支,页面发生了变化,下面会列出 原 master 分支和我的特性分支之间的差异。查看完整后,点击 Create pull request 按钮,跳转到实际发送 pull request 的地方,填写完标题和描述信息后点击 Create pull request。页面会跳转到原仓库 Pull request 页面查看我们刚才创建的 Pull request 的内容,但是已经不能修改,需要原仓库作者来判断,是否需要将 pull request 中的更改加到他的 master 分支上。

Star 和 Watch

Star 是能帮助你跟踪感兴趣仓库的一个有用功能,同时也成为了衡量仓库受欢迎程度的手段。

如果你要跟进一个项目的变化,并希望接收变更通知,GitHub 为你提供了 “Watch” 功能。如果你频繁地在一个仓库上工作,那么我建议你将 watch 设置改为”Watching“(持续关注)。这样,当该仓库发生任何活动时,GitHub 都会通知你,例如当有人向仓库推送变更,创建了新的 Issues,或者在现有 Issues 中添加了评论。

当有一些 commit 被推送到了初始源仓库。你如何让这些更改进入你 fork 的仓库副本中?如果你想继续在你的 fork 上进行开发,那么就需要让你 fork 的副本尽可能与源仓库保持同步

在我的本地仓库中,我已经有一个远程仓库了,那就是 origin

与远程仓库保持同步

注意 origin 一词只是第一次 git clone 远程仓库时使用的默认名称。我们将使用 git remote 命令来向此列表添加一个新的简写名和 URL。这会提供给我们一个与源仓库之间的连接。

$ git remote add upstream https://github.com/udacity/course-collaboration-travel-plans.git

我们来看看在添加了新的远程仓库后,远程仓库的列表现在是什么样的:

与远程仓库保持同步

现在,要获得上游远程仓库的更改,我们只需运行 git pull 并使用 upstream 简写名,而不是 origin 简写名:

$ git pull upstream master

与远程仓库保持同步

一个新的分支添加到了本地。

$ git log --oneline --graph --decorate --all

与远程仓库保持同步

现在本地 master 分支前有一个 upstream/master 远程分支。我们不想运行 git push origin upstream/master,因为 upstream/master 不是本地分支。要将这些更改融入我 fork 的她的项目版本,我可以将 upstream/master 合并到一个现有分支中(例如本地 master 分支)然后推送它。

# 确保我位于正确的合并分支上
$ git checkout master

# 合并 Lam 的更改
$ git merge upstream/master

# 将 Lam 的更改发送到*我的*远程仓库
$ git push origin master

要将源仓库的更改提取到你在 GitHub 上 fork 的仓库副本,你需要:

  • 获得源仓库的可克隆 URL
  • 使用 git remote add 命令创建一个新的远程仓库,使用简写名 upstream 指向源仓库,提供源仓库的 URL
  • 获取新的 upstream 远程仓库
  • upstream 的分支合并到本地分支
  • 将新更新的本地分支推送到你的 origin 仓库

如果项目维护者要求更改 Pull Request,则:

  • 在你的 Pull Request 所基于的本地仓库的同一分支上添加一些必要 commit
  • 将该分支推送到你的源仓库 fork 副本

这些 commit 最终将显示在 Pull Request 页面上。

压制 commit

要将 commit 压制在一起,我们要使用非常强大的 git rebase 命令。

压制的工作原理

与远程仓库保持同步

我们可以运行 git rebase -i HEAD~3,将最后三个 commit 合并或压制成一个 commit,注意 HEAD 指向当前的位置。

与远程仓库保持同步

我们位于 master 分支上,因此 HEAD 指向 master 分支。运行后会创建一个新的 commit SHA,并移动 master 分支使其指向新的 commit,但是注意没有分支指向原始 commit,git 最终将完全清除它们。

与远程仓库保持同步

如果担心损坏仓库并想要备份下,那么在使用 git rebase 时,先创建一个 backup 的分支,将其放在和要 rebase 的分支所在的位置相同的位置。

与远程仓库保持同步

我依然在 master 分支上,没有切换到 backup 分支,接着运行之前的压制命令,这样使多个 commit 压制为一个,并使 master 指向这个新的 commit。但原来 commit 没有被删除,且依然会显示在 git log 输出结果中,因为 backup 分支指向了它们。

rebase 命令

git rebase 命令会将 commit 移动到一个新基底(base)上。命令中的 -i 代表”交互式“。你可以在非交互模式下执行 rebase。在你学习如何 rebase 时,我明确建议你进行交互式 rebase。

  • 使用 ppick – 使 commit 保持原样
  • 使用 rreword – 保留 commit 的内容,但修改 commit 说明
  • 使用 eedit – 保留 commit 的内容,但先不要执行 commit,以便添加新内容或文件、删除内容或文件、修改即将 commit 的内容
  • 使用 ssquash – 将此 commit 的更改结合到之前的 commit 中(列表中位于其上面的 commit )
  • 使用 ffixup – 将此 commit 的更改结合到前一个 commit 中,但删除提交说明
  • 使用 xexec – 运行 shell 命令
  • 使用 ddrop – 删除 commit

强制推送

使用 git rebase 会创建一个具有新 SHA 的新 commit。当我尝试使用 git push 将此 commit 推送至 GitHub 时,GitHub 知道接受此推送会删除那三个单独 commit,所以它拒绝了。因此,我不得不使用 git push -f 强制推送这些 commit。

何时变基

git rebase 命令非常强大。它可以帮助你编辑提交说明、重新排序 commit、合并 commit 等,真的是一款非常强大的工具。现在的问题是”应该何时进行变基?

每当你对 commit 进行变基,Git 将为每个 commit 创建一个新的 SHA!这有很大的影响。对于 Git,SHA 为 commit 的标识符,因此不同的标识符代表着不同的 commit,无论内容是否发生了变化。

如果你已推送了你想进行变基的 commit,则不应变基。如果你在与其他开发者协作,那么他们可能已经在使用你推送的 commit。如果你随后使用 git rebase 来进行更改,并强行推送 commit,则其他开发者现在将无法与远程仓库同步。他们需要对自己的 Git 仓库进行一些复杂的手术,使它们的仓库回到工作状态……甚至可能连这一点都做不了;他们可能得抛弃之前的所有工作,使用你新变基过且强制推送的 commit 重新开始。

Git 分支 - 变基
git-rebase Git 文档

总结

  • 如何设置远程仓库
  • 如何将更改推送到远程仓库并从中获取更改
  • 如何 fork 仓库
  • 开始处理新功能或项目更改前,要采取的初步步骤
  • 如何创建 Pull Request
  • 了解与项目其他利益相关者清楚、频繁沟通的重要性

Git Community Book 中文版
git-tips

相关标签: Git命令