在PyCharm中使用Git进行版本控制的详细指南
在PyCharm中使用Git进行版本控制的详细指南
本文详细介绍了在PyCharm中使用Git进行版本控制的具体操作步骤。从建立Git存储库、增加文件到存储库、排除文件、增加远程存储库,到Pull、Fetch、Update项目,提交与推送更改,查看更改历史,以及分支管理等多个方面进行了详尽的讲解。
1. 建立Git存储库
1.1 基于现有项目创建本地Git存储库
我们可以基于现有项目源创建本地Git存储库。将整个项目与单个Git存储库关联。
主菜单
VCS -> Enable Version Control Integration
或者快捷键 ⌃V (Ctrl + v) 在弹出窗口中选择 Enable Version Control Integration,选择Git作为版本控制系统,然后单击"确定"。
启用VCS集成后,PyCharm将询问您是否要通过VCS共享项目设置文件。您可以选择"Always Add"以与使用PyCharm的其他存储库用户同步项目设置。
除此以外,系统还提示创建.gitgnore文件,先直接创建。这个文件将用于记录那些排除在版本控制的文件。
1.2 从远程主机(克隆)签出项目
主菜单:Preference/Settings -> Version Control -> GitHub, 输入用户名与密码,配置远程GitHub帐户,确保登录成功。也可以选择其它版本工具。
主菜单 VCS -> Get from Version Control,选择选择主机与项目,克隆项目。
1.3 增加文件到存储库
主菜单:
PyCharm/File -> Preference/Settings -> Version Control -> Commit,
这样可以保证在Commit窗口查看本地变化。
可以在
View -> Tools -> Commit
工具窗口展开Unversioned Files节点,选择要添加到Gi的文件,然后按⌘⌥A (Ctrl + Alt + A) 或从上下文菜单中选择"Add to VCS"。也可以从Project工具选择要添加的文件,按⌘⌥A 或从上下文菜单中选择"Add to VCS"。(加到存储库的文件颜色由红色变为绿色)
1.4 从版本控制中排除文件(ignore)
有时需要把一些文件排除在版本控制之外。这些文件可能是VCS管理文件、备份副本等。
Git提供了两种配置文件中列出忽略的文件模式:
2.
.git/info/exclude file
此文件中列出的模式仅适用于存储库的本地副本。当初始化或签出Git存储库时,将自动创建此文件。
4.
VCS根目录.gitignore文件。
这些文件被签入存储库,整个团队都可用其中忽略模式。因此,它是存储忽略的文件模式的最常见位置。上面在创建Git存储库时,就会提示创建这个文件,然后默认会创建在根目录。也可手动在Project窗口中的任意位置右键单击, 选择New -> File 和在New File对话框中键入.gitignore。
在Local Changes窗口 or Project工具窗口,选择文件右击Git -> Add to .gitignore or Git -> Add to .git/info/exclude。选择的文件将被填加对应配置文件当中。
1.5 增加远程存储库
为了能够协作处理Git项目,您需要配置从中获取数据的远程存储库,并在需要共享工作时推送到这些存储库。我们在本地源创建了Git存储库,则需要为其他参与者添加一个远程存储库,以便能够将其更改推送到该存储库,并且能够共享工作的结果。
比如添加远程GitHub存储库,打开要共享的项目,
VCS -> Import into Version Control -> Share Project on GitHub
。前面的步骤我们已经了在PyCharm中注册了Github帐户,系统会自动建立与GitHub的连接后,需要指定远程存储库名称、远程的名称,并输入项目的说明。如果您不想允许其他GitHub用户公开访问存储库,可以选择"Private"选项。点击共享后,选择初次需要提交的文件就可以了。
查看Github网站,新的存储库被创建,我们选择的三个文件也被上传成功了。
在某些情况下,您还需要添加第二个远程存储库。例如,如果克隆了一个没有写入访问权限的存储库,并且要将更改推送到自己的原始项目的分叉,这可能很有用。
主菜单 VCS -> Git -> Remotes, Git Remotes对话框将被打开,此时可以增加新的远程连接。
2. Pull、Fetch与Update项目
三者都用于更新代码,在前一小节已经讲解了三者的不同,在这不再详述。 这里分别演示一下三种方式更新代码的效果。
2.1 Pull Changes
在GitHub编辑rectangle.py文件 (实际工作中,通常是团队成员更新了文件,然后Push到GitHub, 基本不会直接在GitHub上更新)
右键上下文菜单选择
Git -> Repository -> Pull
, 本地文件会被直接更新。
2.2 Fetch Change
在GitHub编辑rectangle.py文件
右键上下文菜单选择
Git -> Repository -> Fetch
, 本地文件没有被直接更新。改变是被作为远程分支存储的,本地文件与远程分支比较
VCS -> Git -> Branches... 选择origin/master -> Compare with Current
,在版本控制工具Git查看异同,如果接受改变,然后
VCS -> Git -> Branches... 选择origin/master -> Merge with Current。
2.3 Update Change
如果整个项目有两个分支,master与xuxh, 在Github分别在两个分支上更新代码。
切换到xuxh分支,修改代码。
主菜单选择
VCS -> Update Project
或者点击工具栏上的Update Project按钮, Event log工具窗回会显示更新状态,本地master作为当前分支,文件直接被更新。
切换到xuxh分支
VCS -> Git -> Branches... 选择xuxh -> Check out
,查看文件并没有被更新,相当执行了Fetch操作。在合并之前先查看不同,然后再merge。
3. 本地更改的提交与推送(Commit and Push)
Git需要用户名才能将提交与标识关联。如果尚未设置用户名,PyCharm将在首次尝试提交更改时提示您指定它。
若要为计算机上的每个Git存储库设置名称
git config --global user.name "xuxh"
若要为单个存储库设置名称
git config user.name "xuxh"
3.1 提交本地更改
主菜单
VCS -> View -> Tool Windows -> Commit
,选择要提交的文件或者changelist, 填写提交信息,选择commit或者Amend Commit
通过工具栏上按钮,可以Rollback代码,可以比较文件,也可以设置提交前与提交后的操作。
有时候我们可能只想提交部分文件更改,比如在test_rectangle.py, 增加了两个方法test_width与test_height, 然后只提交test_width。未选择的改变仍然在当前的Changelist里。
除此以外,也可以将一个文件更改放入不同的更改列表,以实现文件的部分提交。
3.2 将更改推送到远程存储库
在推送更改之前,请与远程同步,并确保存储库的本地副本是最新的,以避免冲突。PyCharm允许将更改从任何分支上载到其跟踪的分支或任何其他远程分支。
要推送当前分支的更改, 主菜单
VCS -> Git -> Push
, Push Commits对话框将显示。
关于Force Push的应用场景,当你运行push时,如果远程存储库在你上次拉取最新代码后又有更新,则Git将拒绝完成Push操作。此时选择Force Push会用本地复本覆盖远程存储库。通常我们是不建议这样用Force Push的,而应执行拉取与远程同步,然后才能使用更改进行更新。
4. 查看Git存储库中的更改
- 查看项目历史记录
View -> Tool Windows -> Git
工具窗口的日志选项卡。它显示提交到所有分支和远程存储库的所有更改。 - 查看两个提交之间的差异
在Git工具窗口的"日志"选项卡中选择两个提交,然后从上下文菜单中选择Compare Version,
打开在所选提交之间修改的文件列表, 单独选择文件查看差异。 - 查看单个文件、目录修改历史
有多个入口可以查修改历史, 从Project工具栏或者编辑器的上下文菜单选择Show History,也可以从主菜单
VCS -> Git -> Show History
5. 分支管理
在Git中,分支是一种强大的机制,我们可以创建不同工作分支应对不同的人与工作用途。通常,除了主分支master外,至少还会建立develop, test以及程序员自己的个人分支。
可以在Git工具窗口的Branch窗格中管理分支
5.1 创建分支
在Branches弹出窗口或Git工具窗口的Branches窗格选择某一分支,然后选择New Branch, 也可以从某一次Commit创建分支。
5.2 在分支间切换
在Branches弹出窗口或Git工具窗口的Branches窗格中,选择要在本地分支下切换到的分支,然后从可用操作列表中选择Checkout。
5.3 比较分支
- 将分支与当前分支进行比较
在Branches弹出窗口或Git工具窗口的Branches窗格中,选择要与当前分支进行比较的分支,右键上下文菜单选择Compare With Current。新的选项卡将添加到Git工具窗口,列出所选分支中存在且当前分支中不存在的所有提交。若要查看两个分支中不同的所有文件的列表,请单击⌘ACtrl + A, 更改的文件窗格将列出包含差异的所有文件。
Tips:可以单击Swap branches链接来更改哪个分支被视为比较其他分支的基础。 - 将分支与Working Tree进行比较
Working Tree可以理解为当前分支的本地状态。如果您有本地未提交的更改,这非常有用。
在Branches弹出窗口或Git工具窗口的Branches窗格中,选择要与本地工作树进行比较的分支,然后选择Show Diff with Working Tree。所选分支和当前分支的本地状态中不同的所有文件的列表将显示在单独的窗口中。
5.4 删除分支
在Branches弹出窗口或Git工具窗口的Branches窗格中,选择要删除的分支,然后选择Delete。
6. 将更改从一个Git分支应用于另一个分支
6.1 Merge Branch
在Branches弹出窗口或Git工具窗口的Branches窗格中,选择目标分支,然后从可用操作列表中选择Checkout。
如果不需要为合并指定选项,请选择要合并到当前分支的分支,然后从子菜单选择Merge into Current。如果工作树是干净的(没有未提交的更改),并且功能分支和目标分支之间没有冲突,Git将合并两个分支,合并提交将显示在Git工具窗口中。
如果需要为合并指定选项, 主菜单VCS -> Git -> Merge Changes去打开Merge对话框。
6.2 Rebase分支
正如他的名字所隐含的意思:rebase存在的价值是:对一个分支做“变基”操作,这意味着改变这个branch的初始commi。它会在新的base上一个一个地运行这个分支上的所有commits。这个概念理解起来可能稍微有点困难,请参考官网git-rebase, 里面有更详尽的介绍。
比如当我试图将本地xuxh分支的改变commit and push到remote对应分支时,被拒绝了,原因是自从上次和origin同步(通过git pull)后,remote xuxh分支又有了新的改变。这种情况下,如果我们强行将我们的代码push过去将会覆盖remote分支上代码,而这往往是不允许的,所以push总会给出下面的提示
点击Rebase, 弹出下面的Conflicts窗口, 通常都会选择Merge… 。如果选择Accept Yours, 相当于把本地代码强行推到远程分支,会覆盖远程分支上一些改变,选择Accept Theirs, 相当于放弃本地的改变。
选择Merge… , 下面的窗口会列出分支的不同
根据代码的情况,进行合并,然后点击Apply, 查看本地代码,远程改变已经合并到本地。
在event log工具栏会看类似的信息:
**11:52 AM Push rejected
Push has been cancelled, because there were conflicts during update.
Check that conflicts were resolved correctly, and invoke push again.
View received commits**
第一次的Push操作已经取消了,上面的操作已经与远程分支同步了,此时再次Push代码就能正常了。
【注意】通常我们只建议在自己的私有分支上做rebase, 永远不要rebase一个已经分享的分支,比如rebase到master,develop,release分支上,如果几个人对同一个分支做了rebase以后,会造成后来的push与同步困难,还有许多相同的changeset。
前面讲了同一分支上的rebase,我们也可以基于另一分支上作同样的“变基”操作,xuxh个人分支是从master创建的,当我们个人分支上开发的时候,master分支可能一直在变化,此时可以通过rebase把master最新代码merge到个人分支上。主菜单:
VCS -> Git -> Rebase
。
后面的操作与前面介绍的一致,会有conflics窗口弹出,然后merge代码,然后点击rebase。
rebase成功后会在Event log显示类似的信息。
12:22 PM Rebase Successful: Rebased xuxh on refs/heads/master
6.3 应用单独的更改
假设你对一个文件做了更改,现在想把这个更改应用到其它分支当中去。比如下面在xuxh分支的test_rectangle.py增加一个新方法test_resize_positive, 现在想应用到master分支
2. 在Branches弹出窗口或Git工具窗口的Branches窗格中,选择目标分支master,然后从可用操作列表中选择Checkout。
4. 然后选择xuxh分支, 找到包含要应用的更改的提交。
6. 在Commit Details面板右侧, 选择包含要应用于目标分支的更改的文件,然后在上下文菜单里选择Apply Selected Changes
8. 在弹出对话框中输入changelist名字。
10. Commit and push到目标分支。
7. 小结
本小节应该是本课程内容最多的一节,详细讲述了在PyCharm里,如何使用Git进行版本管理,包括更新、提交代码,查看历史,如何进行分支合并等等。对于程序员来说,这几乎是每天都要做的事情,对于没用过任何版本控制工具同学来说,需要不断实践,在解决各种各样的情况过程中才能真正掌握,所以这可能需要一点时间。