使用 Git
分叉项目
克隆存储库
开始工作
添加远程存储库
保存更改
合并或重新定基更改
合并
变基
推动变革
概括
Git 是一款免费开源的版本控制系统。许多开发者使用它来加速和轻松协调他们的工作,并提供了许多实现这一目标的方法。人们使用 Git 的方式和方法各不相同。在本文中,我将尝试展示一种简单而有效的方法,用于您自己的项目,或者如果您想要为开源软件 (OSS) 做出贡献。
分叉项目
第一步是创建您想要处理的项目的分支(副本)。这样您就可以在自己的副本上工作,而不必担心在主存储库中犯错。前往您想要处理的项目的 Github 页面,然后点击右上角的“Fork”按钮。
您已成功创建主项目的分支。您的分支现在位于:
https://github.com/<your_github_username>/<your_project_name>
克隆存储库
在 fork 项目后,下一步就是将 fork 的副本克隆到本地机器上。在终端中输入:
git clone <url_of_your_cloned_repo>.git
克隆的 repo 的 URL 如下所示:
https://github.com/<your_github_username>/<your_project_name>
将项目克隆到本地机器后,您可以访问项目文件夹:
cd <your_project_name>
并检查您所在的当前分支:
git branch
默认情况下,您将位于master分支,即项目的主分支。您不应对其进行任何更改,并且仅将其用于使用主存储库中的最新版本更新当前项目(稍后会详细介绍)。
开始工作
现在你想开始这个项目,那么你应该怎么做呢?
首先,从你的 master 分支创建一个新的分支。这样,你就可以从逻辑上将你的新工作与项目的当前(主)版本分开,并避免以后可能出现的与 master 分支合并的问题。
你可以像这样创建一个新的分支:
git checkout -b <name_of_your_working_branch>
这将从你当前的分支(在本例中为 master 分支)创建一个新的分支。它现在基本上是 master 分支的副本。
添加远程存储库
假设你开始在新的分支上工作,这时有人更新了主仓库(你从那里 fork 了项目)。这可能会导致一些问题:
-
其他人已经完成了您想要完成的工作,或者更改了您即将更改的文件。这会导致冲突,您最终可以解决它们,但最好不要走到这一步,因为在解决冲突时犯的错误可能会破坏整个应用程序。
-
其他人更新了 gem 版本,甚至是应用程序的新版本,这使得您的更改过时。
如果您不定期更新存储库,可能会出现以下两个问题。您需要做的第一件事是添加远程存储库:
git remote add <name_of_remote> <url_of_the_main_repository>.git
远程仓库的名称可以是任何尚未添加的名称。克隆项目时,你 fork 的仓库默认会添加为origin,你可以使用以下命令进行检查:
git remote -v
结果看起来应该是这样的:
origin https://github.com/<your_github_username>/<your_project_name> (fetch)
origin https://github.com/<your_github_username>/<your_project_name> (push)
通常使用的主存储库名称是upstream。因此,在输入上述git remote add命令并以upstream作为远程名称后,像以前一样检查远程仓库将会得到一个新的结果:
origin https://github.com/<your_github_username>/<your_project_name> (fetch)
origin https://github.com/<your_github_username>/<your_project_name> (push)
upstream https://github.com/<the_original_repository>/<your_project_name> (fetch)
upstream https://github.com/<the_original_repository>/<your_project_name> (push)
现在您已经添加了分叉(来源)和主(上游)存储库,因此您可以开始进行一些工作。
保存更改
完成一些工作后,您可以使用以下命令检查所有已更改的文件:
git status
推送更改的第一步是添加所有要提交的文件:
git add -A
或者
git add .
两者的区别在于-A选项会将所有更改添加到暂存状态(用于提交)。点 (.)选项会添加除已删除文件之外的所有文件。
接下来,添加所有文件后,您就可以提交它们了。提交意味着将您的更改保存到本地存储库。您可以通过不同的方式执行此操作:
git commit
这将打开一个文本编辑器,您可以在其中添加提交标题和更改描述。
git commit -m "<your_commit_message>"
这样,您可以在同一行添加提交详细信息,而无需在文本编辑器中输入它们。
合并或重新定基更改
在将新创建的提交推送到 Github 上的本地仓库之前,这是将你的仓库与主仓库同步的最佳时机。首先,你需要切换回 master 分支,因为如前所述,我们使用它来将项目更新到最新版本(提交)。
git checkout master
现在你已经切换到 master 分支,需要用主仓库的最新版本来更新它。为此,你可以使用fetch命令:
git fetch upstream master
或者拉命令:
git pull upstream master
这里的区别在于,fetch命令会从上游仓库获取更改,但不会将其应用到本地仓库。接下来,您需要运行merge或rebase命令(下一节将对此进行说明)。pull
命令会同时执行这两个操作:它会获取更改,并将更改应用(合并)到本地仓库。 需要注意的是,第三个参数 (upstream) 是您从中获取(pull)的远程仓库的名称。由于我们需要将本地仓库与主仓库同步,因此我们选择“upstream”。下一步是切换回您正在处理的分支:
git checkout <name_of_your_working_branch>
剩下的就是将 master 分支(我们之前已将其与主仓库的最新版本同步)中的新更改应用到当前工作分支。有两种方法可以做到这一点。
合并
git merge master
第一种方法是将您的提交与主存储库中的所有提交合并,这将创建一个新的合并提交。
如您所见,C4 是您刚刚创建的提交,C3 是主存储库中的新提交。通过执行合并命令,您将创建一个新的合并提交 (C5),它由提交 C3 和 C4 组成。
变基
git rebase master
第二种方法是用主仓库中的所有提交来 rebase 你的提交。这不会像合并那样创建新的合并提交,但提交数量保持不变(主仓库中的所有提交 + 你的新提交)。下图展示了它的样子:
C4 是你刚刚创建的提交,C3 是主仓库中的一个新提交。你的提交正在应用于主仓库中的新更改(提交 C3)。
问题是 - 该使用哪一个?如果您独自开发项目,建议使用rebase ,因为这样可以使您提交的历史记录更清晰。如果您与其他人合作开发项目,使用 rebase 可能会导致不一致,而使用merge则可以始终保留提交历史记录。最终,这取决于个人偏好或项目维护者希望看到的项目。
推动变革
现在,您已成功将提交与主存储库中的更改合并或重新定位,最终可以将更改推送到 Github 上的存储库。请记住,我们分叉的远程存储库名为origin,因此推送更改的命令是:
git push origin <name_of_your_working_branch>
您已成功将更改推送到您在 Github 上 fork 的远程仓库。
最后一步是向主远程仓库创建一个新的拉取请求,以应用您的工作。为此,您需要访问您在 Github 上 fork 的仓库:
https://github.com/<your_github_username>/<your_project_name>
您将收到一条如下所示的新消息:
点击“比较并拉取请求”按钮会打开一个新窗口,你需要选择你的仓库(头仓库)和主仓库分支(基础仓库),以及相应的分支(在本例中,头仓库的分支名称为“name_of_your_working_branch”,基础仓库的分支名称为“master”)。下图展示了一个示例:
您可以根据需要编辑拉取请求的标题和描述。满意后,只需点击“创建拉取请求”即可创建拉取请求。
创建拉取请求后,项目维护者将审查您的代码并决定是否可以合并或是否需要进行更改。
概括
在本文中,我讲解了如何开始使用 Git,包括准备仓库、添加更改、将更改推送到 Github 以及创建拉取请求等步骤。希望本文能帮助您更好地理解 Git 的使用方法,并提升您的编程体验。
鏂囩珷鏉ユ簮锛�https://dev.to/wizardhealth/working-with-git-2cl8