老鐵,這年頭不會點git真不行。
來自專欄 Python程序員
寫在前面,先來吐個槽,知乎這個文章編輯器還真是難用呀,寫的文章怎麼就好看不起來呢,真是醉了,嗯,成功甩鍋。同步發表於:http://www.cnblogs.com/wupeiqi
正如標題所言,這年頭不會點git真不好意思說自己是程序員。為了增加趣味性和可讀性,特地將文章從《小P的創業史》的故事來敘述,這次再看不明白,我也就無能為力了。
本篇文章按照以下順序來聊:
- 版本控制介紹
- git介紹
- git使用之小P創業史:初創期
- Git使用之小P創業史:成長期
- Git使用之小P創業史:快速發展期
- Git使用之小P創業史:成熟期
- Git使用之小P創業史:上市了
- 其他補充
廢話補多少,開整吧.....
一、版本控制
說到版本控制,腦海里總會浮現大學畢業是寫畢業論文的場景,你電腦上的畢業論文一定出現過這番景象!
畢業論文_初稿.doc畢業論文_修改1.doc畢業論文_修改2.doc畢業論文_修改3.doc畢業論文_完整版1.doc畢業論文_完整版2.doc畢業論文_完整版3.doc畢業論文_最終版1.doc畢業論文_最終版2.doc畢業論文_死也不改版.doc...
以上就是使用最原始的方式進行版本控制,但是這種方式有顯著缺點:
- 多個文件,保留所有版本時,需要為每個版本保存一個文件。
- 協同操作,多人協同操作時,需要將文件打包發來發去。
- 容易丟失,被刪除意味著永遠失去...(可以選擇網盤)
為了解決以上版本控制存在問題,應運而生了一批版本控制工具:VSS、CVS、SVN、Git等,其中Git應該屬於絕對霸主地位。
注意:一般版本控制工具包含兩部分
- 客戶端(本地):本地編寫內容以及版本記錄
- 服務端(網盤):將內容和版本記錄同時保存在遠程(可有可無)
二、Git
git 是一個開源的分散式版本控制軟體,用以有效、高速的處理從很小到非常大的項目版本管理。 Git 最初是由Linus Torvalds設計開發的,用於管理Linux內核開發。Git 是根據GNU通用公共許可證版本2的條款分發的自由/免費軟體,安裝參見:http://git-scm.com/
GitHub是一個基於Git的遠程文件託管平台(同GitCafe、BitBucket和GitLab等)。
Git本身完全可以做到版本控制,但其所有內容以及版本記錄只能保存在本機,如果想要將文件內容以及版本記錄同時保存在遠程,則需要結合GitHub來使用。使用場景:
- 無GitHub:在本地 .git 文件夾內維護歷時文件
- 有GitHub:在本地 .git 文件夾內維護歷時文件,同時也將歷時文件託管在遠程倉庫
其他:
集中式:遠程伺服器保存所有版本,用戶客戶端有某個版本
分散式:遠程伺服器保存所有版本,用戶客戶端有所有版本三、Git使用之小P創業史:初創期
小P是一個年輕有為程序員,從小立志要干出一番大事,某個深夜小P在網上查找**老師主演的學習視頻,花了1個小時才找到想要的資源,小P想到和自己一樣的有為青年每天花費大量的時間尋找喜歡老師的作品,感覺自己干大事的機會來了,毅然決然選擇創業,創建一個**平台,提供**老師的所有資源!!!
創業初期,小P獨自封閉開發一個月,第一個版本終於上線:
回顧開發過程,其中辛酸只有小P自己知道。上線完成後的某一天,小P猛然看到自己開發目錄,卧槽這拓麻也太亂了,加入那天程序出問題回滾到上個版本的時候,自己都找不到確定版本,並且我老子做的這個系統日後是要成千上萬人來維護開發,這種通過原始文件來保存版本的形式簡直Low到爆啊。
開始調研:小P發現了版本控制神奇Git,但是都是道聽途說,到底牛逼成什麼樣子也不清楚,所以抱著試試看的態度,小P開始使用Git進行版本控制。
MacBook-Pro-4:pondo wupeiqi$ pwd # 進入程序目錄/Users/wupeiqi/PycharmProjects/pondoMacBook-Pro-4:pondo wupeiqi$ git init # git初始化Initialized empty Git repository in /Users/wupeiqi/PycharmProjects/pondo/.git/
初始化後,會在當前目錄自動創建 .git 文件夾,該文件是Git中最重要的文件夾,因為Git相關文件以及版本都將保存在該文件夾中,有了它,媽媽再也不用擔心我好多文件來記錄版本了,通過Git命令可以將所有版本保存在 .git 文件中,兩條命令創建一個版本:
MacBook-Pro-4:pondo wupeiqi$ git status # 查看當前git狀態On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) .idea/ app01/ db.sqlite3 manage.py pondo/ readme templates/ nothing added to commit but untracked files present (use "git add" to track)MacBook-Pro-4:pondo wupeiqi$ git add . # 添加當前目錄下所有文件到版本庫MacBook-Pro-4:pondo wupeiqi$ git commit -m 第一次提交 # 提交到版本庫,並填寫版本說明,以便以後回滾。[master (root-commit) df47fe4] 第一次提交 33 files changed, 879 insertions(+) create mode 100644 .idea/dictionaries/wupeiqi.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml ...
注意:執行git commit 命令時,可能會提示進行用戶和郵箱的配置,該配置用於記錄當前版本由那個用戶提交
- git config --local user.name 武沛齊
- git config --local user.email you@example.com
Git把管理的文件分為了兩個區域四個狀態。
工作區:當前開發程序所在目錄稱為工作區,即:工作開發都是在該目錄,該區域的文件會有狀態的變化且狀態由git自動檢測,如果程序中文件做任何操作(增、刪、改),文件狀態均會被檢測到,可以使用 【git status】命令查看。
MacBook-Pro-4:pondo wupeiqi$ ls # 查看原程序目錄app01 db.sqlite3 manage.py pondo readme static templatesMacBook-Pro-4:pondo wupeiqi$ git status # 查看git當前狀態On branch masternothing to commit, working tree cleanMacBook-Pro-4:pondo wupeiqi$ touch a.py # 創建新文件MacBook-Pro-4:pondo wupeiqi$ lsa.py app01 db.sqlite3 manage.py pondo readme static templatesMacBook-Pro-4:pondo wupeiqi$ git status # 查看git當前狀態,檢測到:工作區 a.py 發生變化On branch masterUntracked files: (use "git add <file>..." to include in what will be committed) a.pynothing added to commit but untracked files present (use "git add" to track)
版本庫:工作區檢測到有文件發生變化,那麼意味著較上一個版本之後對程序進行了修改,修改完成之後,可以當做下一版本進行提交,那麼就是執行 【git add .】 將所有文件提交到暫存區,然後再執行【git commit -m 又一個版本】提交到版本庫的分支即可,之後可以使用【git log】命令查看版本記錄。
MacBook-Pro-4:pondo wupeiqi$ lsa.py app01 db.sqlite3 manage.py pondo readme static templatesMacBook-Pro-4:pondo wupeiqi$ git status # 文件顏色為紅色,表示在工作區的被修改狀態On branch masterUntracked files: (use "git add <file>..." to include in what will be committed) a.pynothing added to commit but untracked files present (use "git add" to track)MacBook-Pro-4:pondo wupeiqi$ git add . # 將所有相較上一次版本之後所有的修改添加到暫存狀態MacBook-Pro-4:pondo wupeiqi$ git status # 文件顏色為綠色,表示在版本庫的暫存狀態On branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage) new file: a.pyMacBook-Pro-4:pondo wupeiqi$ git commit -m 又一次提交 # 提交到版本庫的分支 [master f139d5d] 又一次提交 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 a.py MacBook-Pro-4:pondo wupeiqi$ git log # 查看歷史版本提交記錄(根據版本commit值可以進行回滾)commit f139d5d0a648af06d8a1ecadd90faf572afc388aAuthor: 武沛齊 <you@example.com>Date: Fri Aug 11 10:02:14 2017 +0800 又一次提交commit df47fe49fc1f14d9cdd1534baa96f46ec71a9934Author: 武沛齊 <you@example.com>Date: Fri Aug 11 08:49:49 2017 +0800 第一次提交
目前已使用Git的四個命令,這四個命令已經可以代替本地多個文件保存版本的方式:
- git init,初始化,表示即將對當前文件夾進行版本控制。
- git status,查看Git當前狀態,如:那些文件被修改過、那些文件還未提交到版本庫等。
- git add 文件名,將指定文件添加到版本庫的暫存狀態。
- git commit -m 提交信息,將暫存區的文件提交到版本庫的分支。
- git log,查看提交記錄,即:歷史版本記錄
調研完,小P好氣自己喲,這麼6的東西為什麼沒有早發現,從此小P的版本管理就告別繁雜的文件夾了,趕緊搞起來。
MacBook-Pro-4:pondo wupeiqi$ lsapp01 db.sqlite3 manage.py pondo static templates MacBook-Pro-4:pondo wupeiqi$ git initInitialized empty Git repository in /Users/wupeiqi/PycharmProjects/pondo/.git/ MacBook-Pro-4:pondo wupeiqi$ git config --local user.name 武沛齊 MacBook-Pro-4:pondo wupeiqi$ git config --local user.email wupeiqi@live.com MacBook-Pro-4:pondo wupeiqi$ git add . MacBook-Pro-4:pondo wupeiqi$ git commit -m 項目首次移植到Git控制版本 [master (root-commit) 6c439d2] 項目首次移植到Git控制版本 32 files changed, 870 insertions(+) create mode 100644 .idea/dictionaries/wupeiqi.xml create mode 100644 .idea/encodings.xml ...
恰好,此時需要開發一個非洲專區的功能,再也不用重新copy一遍文件了,在工作區直接開始搞起來,30分鐘開發測試完成,又一個版本完成了咯!!!
MacBook-Pro-4:pondo wupeiqi$ git status # 非洲專區功能的開發,僅對app01/views.py進行了修改On branch masterChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: app01/views.py no changes added to commit (use "git add" and/or "git commit -a") MacBook-Pro-4:pondo wupeiqi$ git add . MacBook-Pro-4:pondo wupeiqi$ git commit -m 非洲專區上線[master 0972f4b] 非洲專區上線 1 file changed, 3 insertions(+), 1 deletion(-)MacBook-Pro-4:pondo wupeiqi$
非洲專區上線一個月後,接連收到用戶投訴,原來清新脫俗的小P那裡去了?怎麼變得如此重口味?想回到過去....
小P向來秉承為人民服務的原則,人民不想看那一定要修改。決定:回滾,回到上一個版本。
那麼問題來了?
一個月過去了,代碼修改的位置早就忘記了,怎麼修改,總不能再開發一遍吧。機智的小P猜想Git既然這麼牛逼,應該會提供這樣的功能,經過一番查找,果不其然Git提供了這個回滾的功能。
回滾到指定版本:
MacBook-Pro-4:pondo wupeiqi$ git logcommit 0972f4bb43104baee15aeec2dd62bd0a307ec837Author: 武沛齊 <wupeiqi@live.com>Date: Fri Aug 11 10:54:42 2017 +0800 非洲專區上線 commit 6c439d2fd0d943f36f3ee84e158ff86b052961d2Author: 武沛齊 <wupeiqi@live.com>Date: Fri Aug 11 10:42:09 2017 +0800 項目首次移植到Git控制版本 MacBook-Pro-4:pondo wupeiqi$ git reset --hard 6c439d2fd0d943f36f3ee84e158ff86b052961d2HEAD is now at 6c439d2 項目首次移植到Git控制版本 # 命令執行完,工作區的所有文件就變成未開發非洲專區功能之前了,太爽了有么有....
回滾倒是完成了,小P在想如果某一天想要在回有非洲專區功能的版本怎麼辦呢?來來來,不能像以往通過【git log】來查看記錄再回滾了,再回去需要這麼搞:
MacBook-Pro-4:pondo wupeiqi$ git reflog6c439d2 HEAD@{2}: reset: moving to 6c439d2fd0d943f36f3ee84e158ff86b052961d20972f4b HEAD@{3}: commit: 非洲專區上線6c439d2 HEAD@{4}: commit (initial): 項目首次移植到Git控制版本 MacBook-Pro-4:pondo wupeiqi$ git reset --hard 0972f4bHEAD is now at 0972f4b 非洲專區上線
四、Git使用之小P創業史:成長期
企業想要不被淘汰,就要跟緊時代步伐,近日直播行業日趨火熱,小P的也希望自己的平台加入直播功能,已經評估預計2個月開發完成,小P開始沒日沒夜的幹了起來...
一個月過去了,開發任務和按照預期有條不紊的進行著,直播功能也已完成一半,就是在此時線上運行平台出現Bug需要緊急修復,怎麼辦?怎麼辦??怎麼辦???
小P出了幾個解決方案:
- 正在開發代碼不動,拷貝一份線上運行的代碼進行修改 ------> 不行,又踏馬回去拷貝去了。
- 把開發了一個月的代碼刪掉,修改Bug,然後再重頭開始 ------> 不行,一定是傻逼才這麼干,我不是傻逼。
- 聽說git的stash可以 ------> 聽說過,沒見過
- 聽說git的branch可以 ------> 聽說過,沒見過
方案一:stash
stash用於將工作區發生變化的所有文件獲取臨時存儲在「某個地方」,將工作區還原當前版本未操作前的狀態;stash還可以將臨時存儲在「某個地方」的文件再次拿回到工作區。
acBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 開發直播功能,剛開發到一半 MacBook-Pro-4:pondo wupeiqi$ git statusOn branch masterChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: app01/views.py no changes added to commit (use "git add" and/or "git commit -a") MacBook-Pro-4:pondo wupeiqi$ git stash # 將開發到一半的直播功能,臨時存儲到「某個地方」Saved working directory and index state WIP on master: 0972f4b 非洲專區上線HEAD is now at 0972f4b 非洲專區上線 MacBook-Pro-4:pondo wupeiqi$ git status # 工作區回到當前版本未做任何操作前On branch masternothing to commit, working tree clean MacBook-Pro-4:pondo wupeiqi$ vim pondo/settings.py # 緊急修復bugMacBook-Pro-4:pondo wupeiqi$ git statusOn branch masterChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: pondo/settings.pyno changes added to commit (use "git add" and/or "git commit -a") MacBook-Pro-4:pondo wupeiqi$ git add . # 添加到修改bug的代碼到暫存狀態MacBook-Pro-4:pondo wupeiqi$ git commit -m 緊急修復bug # 提交修復Bug的代碼到分支[master 1300d33] 緊急修復bug 1 file changed, 1 insertion(+) MacBook-Pro-4:pondo wupeiqi$ git stash pop # 將開發到一半的直播功能從「某個地方」再次拿會工作區繼續開發On branch masterChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: app01/views.py no changes added to commit (use "git add" and/or "git commit -a")Dropped refs/stash@{0} (059d78ca8fa204f9559bd3ce0ae76235969b4301)
特別的:執行 git stash pop 命令時,可能會遇到衝突,因為在緊急修復bug的代碼和通過stash存儲在「某個地方」的代碼會有重合部分,所以執行 git stash pop 時候就會出現衝突,有衝突解決衝突即可。
stash相關常用命令:
- git stash 將當前工作區所有修改過的內容存儲到「某個地方」,將工作區還原到當前版本未修改過的狀態
- git stash list 查看「某個地方」存儲的所有記錄
- git stash clear 清空「某個地方」
- git stash pop 將第一個記錄從「某個地方」重新拿到工作區(可能有衝突)
- git stash apply 編號, 將指定編號記錄從「某個地方」重新拿到工作區(可能有衝突)
- git stash drop 編號,刪除指定編號的記錄
方案二:branch
分支學習:branch稱為分支,默認僅有一個名為master的分支。一般開發新功能流程為:開發新功能時會在分支dev上進行,開發完畢後再合併到master分支。
MacBook-Pro-4:pondo wupeiqi$ git branch dev # 創建新分支,即:拷貝一份當前所在分支代碼到新分支MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切換到dev分支MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 開發功能MacBook-Pro-4:pondo wupeiqi$ git status # 查看狀態,即:在dev分支修改了app01/views.py文件On branch devChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: app01/views.pyno changes added to commit (use "git add" and/or "git commit -a")MacBook-Pro-4:pondo wupeiqi$ git add . # 將修改文件添加到版本庫的暫存區MacBook-Pro-4:pondo wupeiqi$ git commit -m 新功能開發完畢 # 將暫存區的內容提交到當前所在分支,即:dev分支[dev 32b40cd] 新功能開發完畢 1 file changed, 2 insertions(+) MacBook-Pro-4:pondo wupeiqi$ git checkout master # 切換回master分支 Switched to branch masterMacBook-Pro-4:pondo wupeiqi$ git merge dev # 將dev分支內容合併到master分支Updating 0972f4b..32b40cdFast-forward app01/views.py | 2 ++ 1 file changed, 2 insertions(+)
學習參考上圖,小P也可以按照著這樣的流程進行開發,如果遇到上文開發到一般需要臨時修復Bug的情況,可以按照下圖的流程進行:
MacBook-Pro-4:pondo wupeiqi$ git branch # 當前在master分支* master MacBook-Pro-4:pondo wupeiqi$ git branch dev # 創建dev分支用於開發新功能 MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切換到dev分支Switched to branch dev MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 開發新功能到一半,需要緊急修復Bug MacBook-Pro-4:pondo wupeiqi$ git add . MacBook-Pro-4:pondo wupeiqi$ git commit -m 新功能開發一半[dev b3ac2cb] 新功能開發一半 1 file changed, 2 insertions(+) MacBook-Pro-4:pondo wupeiqi$ git checkout master # 切換回master分支Switched to branch master MacBook-Pro-4:pondo wupeiqi$ git branch bug # 創建bug分支 MacBook-Pro-4:pondo wupeiqi$ git checkout bug # 切換到bug分支Switched to branch bug MacBook-Pro-4:pondo wupeiqi$ vim pondo/settings.py # 修改bug MacBook-Pro-4:pondo wupeiqi$ git add . # 提交bug MacBook-Pro-4:pondo wupeiqi$ git commit -m 緊急修復bug # 提交bug[bug f42f386] 緊急修復bug 1 file changed, 1 insertion(+), 1 deletion(-) MacBook-Pro-4:pondo wupeiqi$ git checkout master # 切換會masterSwitched to branch master MacBook-Pro-4:pondo wupeiqi$ git merge bug # 將bug分支內容合併到master分支,表示bug修復完畢,可以上線Updating 0972f4b..f42f386Fast-forward pondo/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切換到dev分支,繼續開發新功能Switched to branch dev MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 繼續開發其他一半功能 MacBook-Pro-4:pondo wupeiqi$ git add . # 提交新功能 MacBook-Pro-4:pondo wupeiqi$ git commit -m 繼續開發完成 # 提交功能[dev c0bfb27] 繼續開發完成 1 file changed, 1 insertion(+) MacBook-Pro-4:pondo wupeiqi$ git checkout master # 切換回master分支Switched to branch master MacBook-Pro-4:pondo wupeiqi$ git merge dev # 將dev分支合併到master分支Merge made by the recursive strategy. app01/views.py | 3 +++ 1 file changed, 3 insertions(+)
注意:git merge 時也可能會出現衝突,解決衝突的方式上述stash相同,即:找到衝突文件,手動修改衝突並提交,此處不再敖述。
branch相關常用命令:
- git branch 分支名稱 創建分支
- git checkout 分支名稱 切換分支
- git branch -m 分支名稱 創建並切換到指定分支
- git branch 查看所有分支
- git branch -d 分支名稱 刪除分支
- git merge 分支名稱 將指定分支合併到當前分支
五、Git使用之小P創業快速發展期
小P不忘初心始終如一的為廣大有為青年提供資源,使得網站的訪問量不斷攀升,已經出具規模並賺了一些錢,有錢就要造么,索性國貿租了一間寫字樓用於辦公,並且也完善運營市場團隊。。屌絲終歸是屌絲,小P還是離不開寫代碼的習慣,所以開發的任務還是由自己一人承擔,小P從此開始了白天在國貿寫代碼,晚上回天通苑寫代碼。PS:有錢,公司一台新電腦,家裡一台原來老電腦。。。。。 媽的,故事怎麼才能變得有趣呢?太拓麻難了。
小P心裡開始尋思,我愛寫代碼,公司寫,家裡寫,如果每天來回帶一個U盤拷貝著實麻煩,Git有沒有類似於雲盤似得東西可以進行數據同步呢?答案肯定是有。 必須有,不然老子真的就編不下去了。
GitHub,一個基於Git實現的代碼託管的平台,可以將內容以及版本記錄在遠程也保存一份,這樣就不用U盤咯(類似於雲盤)。PS: 類似GitHub的產品還有許多,如:GitLab、Bitbucket、碼雲等。
基於GitHub實現代碼託管,需要一下步驟:
- 註冊GitHub
- 創建倉庫,創建完倉庫後會有一個URL代指該倉庫,如:
- git可以是用該URL進行向遠程推送版本信息或獲取版本信息
小P學會使用Git和GitHub之後,就可以基於GitHub進行代碼遠程託管。
在家裡,小P開發完畢部分功能將代碼推送到GitHub。
MacBook-Pro-4:pondo wupeiqi$ git remote add origin https://github.com/WuPeiqi/pondo.git # 為地址起一個別名originMacBook-Pro-4:pondo wupeiqi$ git push origin master # 將本地master分支內容以及版本信息推送到GitHubUsername for https://github.com: # 輸入GitHub用戶名Password for https://wupeiqi@github.com: # 輸入GitHub密碼Counting objects: 2, done.Delta compression using up to 4 threads.Compressing objects: 100% (2/2), done.Writing objects: 100% (2/2), 270 bytes | 0 bytes/s, done.Total 2 (delta 1), reused 0 (delta 0)remote: Resolving deltas: 100% (1/1), completed with 1 local object.To https://github.com/WuPeiqi/pondo.git 634aac4..274f1e4 master -> masterMacBook-Pro-4:pondo wupeiqi$ git push origin dev # 將本地dev分支內容以及版本信息推送到GitHubCounting objects: 3, done.Delta compression using up to 4 threads.Compressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 261 bytes | 0 bytes/s, done.Total 3 (delta 1), reused 0 (delta 0)remote: Resolving deltas: 100% (1/1), completed with 1 local object.To https://github.com/WuPeiqi/pondo.git 274f1e4..50e2169 dev -> dev
在公司,新電腦第一次使用,需要將代碼從GitHub中獲取並繼續開發,開發完事下班就下班回家。
MacBook-Pro-4:github wupeiqi$ git clone https://github.com/WuPeiqi/pondo.git # 將項目從GitHub中獲取Cloning into pondo...remote: Counting objects: 31, done.remote: Compressing objects: 100% (26/26), done.remote: Total 31 (delta 2), reused 30 (delta 1), pack-reused 0Unpacking objects: 100% (31/31), done.MacBook-Pro-4:github wupeiqi$ cd pondo/MacBook-Pro-4:pondo wupeiqi$ git Branch # 默認獲取到得只有master分支* masterMacBook-Pro-4:pondo wupeiqi$ git branch dev origin/dev # 創建dev分支且和遠程dev分支同步Branch dev set up to track remote branch dev from origin.MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切換到dev分支Switched to branch dev MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 繼續開發新功能 MacBook-Pro-4:pondo wupeiqi$ git add . # 添加文件到版本庫的暫存狀態MacBook-Pro-4:pondo wupeiqi$ git commit -m 公司開發功能1 # 提交新功能到版本庫的分支[dev 9281447] 公司開發功能1 1 file changed, 1 insertion(+), 1 deletion(-)MacBook-Pro-4:pondo wupeiqi$ git push origin dev # 提交dev分支內容到遠程GitHub託管倉庫的dev分支Username for https://github.com: wupeiqiPassword for https://wupeiqi@github.com:Counting objects: 4, done.Delta compression using up to 4 threads.Compressing objects: 100% (4/4), done.Writing objects: 100% (4/4), 427 bytes | 0 bytes/s, done.Total 4 (delta 2), reused 0 (delta 0)remote: Resolving deltas: 100% (2/2), completed with 2 local objects.To https://github.com/WuPeiqi/pondo.git 50e2169..9281447 dev -> dev
在家裡,由於白天在公司已經開發一部分功能並提交到GitHub,家裡電腦的代碼還是昨晚的版本,所以需要從GitHub拉去最新代碼,然後繼續開發。
MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切換到dev分支Already on devMacBook-Pro-4:pondo wupeiqi$ git pull origin dev # 從遠程GitHub倉庫獲取dev分支最新內容,併合併到本地remote: Counting objects: 4, done.remote: Compressing objects: 100% (2/2), done.remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0Unpacking objects: 100% (4/4), done.From https://github.com/WuPeiqi/pondo * branch dev -> FETCH_HEAD 50e2169..9281447 dev -> origin/devUpdating 50e2169..9281447Fast-forward app01/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 繼續開發新功能 MacBook-Pro-4:pondo wupeiqi$ git add . # 添加文件到版本庫的暫存狀態MacBook-Pro-4:pondo wupeiqi$ git commit -m 家裡開發功能1 # 提交新功能到版本庫的分支
在公司,由於昨天晚上在家已經開發了一部分功能,在公司需要先把昨晚開發的功能從GitHub中拉取,並繼續開發。
MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切換到dev分支MacBook-Pro-4:pondo wupeiqi$ git fetch origin dev # 從GitHub倉庫獲取dev分支最新內容到版本庫的分支remote: Counting objects: 3, done.remote: Compressing objects: 100% (1/1), done.remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0Unpacking objects: 100% (3/3), done.From https://github.com/WuPeiqi/pondo * branch dev -> FETCH_HEAD 150d891..65b6604 dev -> origin/devMacBook-Pro-4:pondo wupeiqi$ git merge origin/dev # 將版本庫的分支內容合併到工作區Updating 150d891..65b6604Fast-forward readme | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 繼續開發新功能MacBook-Pro-4:pondo wupeiqi$ git add . # 添加文件到版本庫的暫存狀態MacBook-Pro-4:pondo wupeiqi$ git commit -m xxxxxxxxxxx # 提交新功能到版本庫的分支
長此以往,將Git和GitHub結合使用做到避免電腦損壞造成數據丟失以及多地開發的問題,上文執行過程中執行 【git pull origin 分支】命令等同於【git fetch origin 分支】+ 【git merge origin/分支】,並且在執行過程中可能會出現衝突,原因是由於本地代碼和獲取的最新代碼有重合部分,那麼就需要自己手動解決衝突然後再繼續開發。
六、Git使用之小P創業成熟期
P的公司發展越來越好,但是公司產品單一是嚴重缺點,經過學習考察小P決定再招聘3個Python程序開發另外一個產品「約P」平台來豐富公司業務線,為用戶提供一整套服務。
小P的Slogan:看了想要,想要就約。 不要問我怎麼想要的,我自己也不知道 哈哈哈哈哈哈哈哈
「約P」平台需要三人協同開發,GitHub中多人協同開發和單人開發還是有點差別,協同開發一般有兩種方式:
- 合作者,將其他用戶添加到倉庫合作者中之後,該用戶就具有向當前倉庫提交代碼。
- 組織,創建一個組織,然後再該組織下可以創建多個項目,組內成員可以向組內所有項目提交代碼。PS:也可以對某個項目指定合作者
協同開發命令和以上步驟類似,此處就不再重新寫代碼,而是使用文件描述三人協同開發整個過程。
- 創建程序
- 用戶A創建程序,提交到GitHub
- 用戶B克隆項目
- 用戶C克隆項目
- 開發功能
- 用戶A開發功能1
- 用戶B開發功能2
- 用戶C開發功能3
- 提交
- 用戶A提交功能1,並push(A用戶手速快,先提交。)
- 用戶B提交功能2,無法push,因為GitHub上已經有其他人提交的新代碼。解決方法:從GitHub上獲取最新代碼併合併到本地,提交自己開發的功能2。
- 用戶C提交功能3,無法push,無法提交,因為GitHub上已經有其他人提交的新代碼。解決方法:從GitHub上獲取最新代碼併合併到本地,提交自己開發的功能3。
- 獲取最新代碼
- 用戶A獲取最新代碼
- 用戶B獲取最新代碼
- 用戶C獲取最新代碼
在上面紅色標註的解決方法位置可以有三種方式操作,三者都可以完成合併並提交新功能,但是日誌記錄會有差異,如:前兩者版本記錄中會出現合併,而第三種可以保證版本記錄乾淨整潔。
- 先 git pull origin master 然後 git push origin master
- 先 git fetch origin master 然後 git merge origin/master 再 git push origin master
- 先 git fetch origin master 然後 git rebase origin/master 再 git push origin master
七、Git使用之小P創業史:上市了
終於終於小P等到了公司上市實現財務自由,但作為一個技術屌還是脫離不了屌絲的本質,所以每天都是逛逛github,看看別人有什麼好的項目,自己可以給他挑挑bug裝裝逼,但是別人不可能給小P搞成合作者什麼的,那怎麼才能給別人貢獻代碼呢?那就是fork了。。。。
- 找到想搞的項目,fork一下,然後這個項目就在自己倉庫出現了
- 從自己倉庫獲取代碼並進行編輯提交
- 創建並提交一個pull request,然後等待原作者是否同意這個pull request,如果同意那麼在作者的源代碼中就推出現小P提交的功能
八、其他補充
1. 配置文件
Git的配置文件有三個:
- 系統配置: /private/etc/gitconfig
- 用戶配置: ~/.gitconfig
- 項目配置:.git/config
2. 用戶憑證
由於Git和Github交互操作可能會很頻繁,那麼一定少了用戶授權的操作,為了防止每次操作重複輸入用戶名和密碼,Git提供了兩種解決方法:
- 秘鑰首先創建一對秘鑰 ssh-keygen -t rsa,然後將 id_rsa.pub (公鑰)內容拷貝到github中,日後操作無需再輸入用戶名和密碼。注意:這種方式需要使用GIt中 git@github.com:WuPeiqi/xxxxx.git 格式地址。
- 密碼Https訪問git時,避免每次操作需要輸入用戶名和密碼,可以在配置文件中添加如下配置項: [credential] helper = store/cache/第三方store: 表示將用戶名和密碼保存在硬碟上 第一次輸入過用戶名和密碼之後,用戶名和密碼就會保存在當前用戶根目錄的 .git-credentials 文件中,內容格式為:https://用戶名:密碼@http://github.com 自動添加配置命令:git config credential.helper storecache: 表示將用戶名和密碼保存在緩存中 第一次輸入過用戶名和密碼之後,用戶名和密碼就會保存在緩存中,默認超時時間是 900 秒,緩存相關文件保存在當前用戶根目錄的 git-credential-cache 中 自動添加配置命令: git config credential.helper cache git config credential.helper cache --timeout=300相關操作: 清除緩存:git credential-cache exit 指定超時: [credential] helper = cache --timeout=300注意: 這種方式需要使用GIt中 https://github.com/WuPeiqi/xxxx.git 格式地址。 指定用戶名和密碼: https://用戶名:密碼@http://github.com/wupeiqi/xxx.git
就醬紫,以後想到再加吧...
推薦閱讀:
※說說Git reset 與 revert 的故事
※Git速查表匯總
※g++ -o hello hello.cpp產生的可執行文件文件類型是什麼?
※GitCafe 被 Coding 收購的原因和意義?