在 PyCharm 里使用git
上一小節里介紹了 PyCharm 集成了哪些版本工具及常用的一些功能,其中一些功能介紹的比較簡單,這小節將以 Git 為例,結合實際的工作場景,詳細介紹在版本控制中常用功能。
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 從遠程主機(克?。┖灣鲰椖?/h3>
主菜單: 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 提供了兩種配置文件中列出忽略的文件模式:
-
.git/info/exclude file
此文件中列出的模式僅適用于存儲庫的本地副本。當初始化或簽出 Git 存儲庫時,將自動創建此文件。 -
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 工具窗口,列出所選分支中存在且當前分支中不存在的所有提交。若要查看兩個分支中不同的所有文件的列表,請單擊 ?A Ctrl + 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 分支
- 在 Branches 彈出窗口或 Git 工具窗口的 Branches 窗格中,選擇目標分支master,然后從可用操作列表中選擇 Checkout。
- 然后選擇xuxh 分支, 找到包含要應用的更改的提交。
- 在 Commit Details 面板右側, 選擇包含要應用于目標分支的更改的文件,然后在上下文菜單里選擇 Apply Selected Changes
- 在彈出對話框中輸入 changelist 名字。
- Commit and push 到目標分支。
7. 小結
本小節應該是本課程內容最多的一節,詳細講述了在PyCharm里,如何使用Git進行版本管理,包括更新、提交代碼,查看歷史,如何進行分支合并等等。對于程序員來說,這幾乎是每天都要做的事情,對于沒用過任何版本控制工具同學來說,需要不斷實踐,在解決各種各樣的情況過程中才能真正掌握,所以這可能需要一點時間。