Git 版本控制
版本控制
說到版本控制,腦海里總會浮現大學畢業是寫畢業論文的場景,你電腦上的畢業論文一定出現過這番景象!
| 1 2 3 4 5 6 7 8 9 10 11 | 畢業論文_初稿.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進行版本控制。
| 1 2 3 4 | MacBook-Pro-4:pondo wupeiqi$?pwd???????????????????# 進入程序目錄 /Users/wupeiqi/PycharmProjects/pondo MacBook-Pro-4:pondo wupeiqi$ git init????????????????# git初始化 Initialized empty Git repository?in?/Users/wupeiqi/PycharmProjects/pondo/.git/ |
初始化后,會在當前目錄自動創建 .git 文件夾,該文件是Git中最重要的文件夾,因為Git相關文件以及版本都將保存在該文件夾中,有了它,媽媽再也不用擔心我好多文件來記錄版本了,通過Git命令可以將所有版本保存在 .git 文件中,兩條命令創建一個版本:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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】命令查看。
1 MacBook-Pro-4:pondo wupeiqi$ ls # 查看原程序目錄 2 app01 db.sqlite3 manage.py pondo readme static templates 3 MacBook-Pro-4:pondo wupeiqi$ git status # 查看git當前狀態 4 On branch master 5 nothing to commit, working tree clean 6 MacBook-Pro-4:pondo wupeiqi$ touch a.py # 創建新文件 7 MacBook-Pro-4:pondo wupeiqi$ ls 8 a.py app01 db.sqlite3 manage.py pondo readme static templates 9 MacBook-Pro-4:pondo wupeiqi$ git status # 查看git當前狀態,檢測到:工作區 a.py 發生變化 10 On branch master 11 Untracked files: 12 (use "git add <file>..." to include in what will be committed) 13 14 a.py 15 16 nothing added to commit but untracked files present (use "git add" to track)?
版本庫:工作區檢測到有文件發生變化,那么意味著較上一個版本之后對程序進行了修改,修改完成之后,可以當做下一版本進行提交,那么就是執行 【git add .】 將所有文件提交到暫存區,然后再執行【git commit -m '又一個版本'】提交到版本庫的分支即可,之后可以使用【git log】命令查看版本記錄。
1 MacBook-Pro-4:pondo wupeiqi$ ls 2 a.py app01 db.sqlite3 manage.py pondo readme static templates 3 4 MacBook-Pro-4:pondo wupeiqi$ git status # 文件顏色為紅色,表示在工作區的被修改狀態 5 On branch master 6 Untracked files: 7 (use "git add <file>..." to include in what will be committed) 8 9 a.py 10 nothing added to commit but untracked files present (use "git add" to track) 11 12 MacBook-Pro-4:pondo wupeiqi$ git add . # 將所有相較上一次版本之后所有的修改添加到暫存狀態 13 14 MacBook-Pro-4:pondo wupeiqi$ git status # 文件顏色為綠色,表示在版本庫的暫存狀態 15 On branch master 16 Changes to be committed: 17 (use "git reset HEAD <file>..." to unstage) 18 19 new file: a.py 20 21 MacBook-Pro-4:pondo wupeiqi$ git commit -m '又一次提交' # 提交到版本庫的分支 22 [master f139d5d] 又一次提交 23 file changed, 0 insertions(+), 0 deletions(-) 24 create mode 100644 a.py 25 26 MacBook-Pro-4:pondo wupeiqi$ git log # 查看歷史版本提交記錄(根據版本commit值可以進行回滾) 27 commit f139d5d0a648af06d8a1ecadd90faf572afc388a 28 Author: 武沛齊 <you@example.com> 29 Date: Fri Aug 11 10:02:14 2017 +0800 30 31 又一次提交 32 33 commit df47fe49fc1f14d9cdd1534baa96f46ec71a9934 34 Author: 武沛齊 <you@example.com> 35 Date: Fri Aug 11 08:49:49 2017 +0800 36 37 第一次提交?
目前已使用Git的四個命令,這四個命令已經可以代替本地多個文件保存版本的方式:
- git init,初始化,表示即將對當前文件夾進行版本控制。
- git status,查看Git當前狀態,如:那些文件被修改過、那些文件還未提交到版本庫等。
- git add 文件名,將指定文件添加到版本庫的暫存狀態。
- git commit -m '提交信息',將暫存區的文件提交到版本庫的分支。
- git log,查看提交記錄,即:歷史版本記錄
?調研完,小P好氣自己喲,這么6的東西為什么沒有早發現,從此小P的版本管理就告別繁雜的文件夾了,趕緊搞起來。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | MacBook-Pro-4:pondo wupeiqi$?ls app01?????? db.sqlite3? manage.py?? pondo?????? static????? templates MacBook-Pro-4:pondo wupeiqi$ git init Initialized 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分鐘開發測試完成,又一個版本完成了咯!!!
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | MacBook-Pro-4:pondo wupeiqi$ git status????????????# 非洲專區功能的開發,僅對app01/views.py進行了修改 On branch master Changes 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提供了這個回滾的功能。
回滾到指定版本:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | MacBook-Pro-4:pondo wupeiqi$ git log commit 0972f4bb43104baee15aeec2dd62bd0a307ec837 Author: 武沛齊 <wupeiqi@live.com> Date:?? Fri Aug 11 10:54:42 2017 +0800 ????非洲專區上線 commit 6c439d2fd0d943f36f3ee84e158ff86b052961d2 Author: 武沛齊 <wupeiqi@live.com> Date:?? Fri Aug 11 10:42:09 2017 +0800 ????項目首次移植到Git控制版本 MacBook-Pro-4:pondo wupeiqi$ git reset --hard 6c439d2fd0d943f36f3ee84e158ff86b052961d2 HEAD is now at 6c439d2 項目首次移植到Git控制版本 # 命令執行完,工作區的所有文件就變成未開發非洲專區功能之前了,太爽了有么有.... |
回滾倒是完成了,小P在想如果某一天想要在回有非洲專區功能的版本怎么辦呢?來來來,不能像以往通過【git log】來查看記錄再回滾了,再回去需要這么搞:
| 1 2 3 4 5 6 7 | MacBook-Pro-4:pondo wupeiqi$ git reflog 6c439d2 HEAD@{2}: reset: moving to 6c439d2fd0d943f36f3ee84e158ff86b052961d2 0972f4b HEAD@{3}: commit: 非洲專區上線 6c439d2 HEAD@{4}: commit (initial): 項目首次移植到Git控制版本 MacBook-Pro-4:pondo wupeiqi$ git reset --hard 0972f4b HEAD is now at 0972f4b 非洲專區上線 |
Git使用之小P創業史:成長期
企業想要不被淘汰,就要跟緊時代步伐,近日直播行業日趨火熱,小P的也希望自己的平臺加入直播功能,已經評估預計2個月開發完成,小P開始沒日沒夜的干了起來...
一個月過去了,開發任務和按照預期有條不紊的進行著,直播功能也已完成一半,就是在此時線上運行平臺出現Bug需要緊急修復,怎么辦?怎么辦??怎么辦???
小P出了幾個解決方案:
- 正在開發代碼不動,拷貝一份線上運行的代碼進行修改 ? ? ? ? ------> 不行,又踏馬回去拷貝去了。
- 把開發了一個月的代碼刪掉,修改Bug,然后再重頭開始 ? ? ?------> 不行,一定是傻逼才這么干,我不是傻逼。
- 聽說git的stash可以 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ------> 聽說過,沒見過
- 聽說git的branch可以 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ------> 聽說過,沒見過
方案一:stash
stash用于將工作區發生變化的所有文件獲取臨時存儲在“某個地方”,將工作區還原當前版本未操作前的狀態;stash還可以將臨時存儲在“某個地方”的文件再次拿回到工作區。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | acBook-Pro-4:pondo wupeiqi$ vim app01/views.py?????????????# 開發直播功能,剛開發到一半 MacBook-Pro-4:pondo wupeiqi$ git status On branch master Changes 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 master nothing to commit, working tree clean MacBook-Pro-4:pondo wupeiqi$ vim pondo/settings.py?????????# 緊急修復bug MacBook-Pro-4:pondo wupeiqi$ git status On branch master Changes 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.py no 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 master Changes 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 時候就會出現沖突,有沖突解決沖突即可。
1 a. 原來內容: 2 from django.shortcuts import render,HttpResponse 3 4 def index(request): 5 return render(request,'index.html') 6 7 def africa(request): 8 return HttpResponse('非洲專區') 9 10 11 b. 開發到一半直播功能: 12 from django.shortcuts import render,HttpResponse 13 14 def index(request): 15 return render(request,'index.html') 16 17 def africa(request): 18 return HttpResponse('非洲專區') 19 20 21 def live(request): 22 print('開發到一半') 23 return HttpResponse('....') 24 25 26 c. 執行git stash,回到當前版本未修改狀態: 27 from django.shortcuts import render,HttpResponse 28 29 def index(request): 30 return render(request,'index.html') 31 32 def africa(request): 33 return HttpResponse('非洲專區') 34 35 d. 修復Bug并提交: 36 from django.shortcuts import render,HttpResponse 37 38 def index(request): 39 return render(request,'index.html') 40 41 def africa(request): 42 return HttpResponse('非洲xxxxx專區') 43 44 45 e. 繼續開發直播功能 git stash pop,此時會出現沖突: 46 MacBook-Pro-4:pondo wupeiqi$ git stash pop 47 Auto-merging app01/views.py 48 CONFLICT (content): Merge conflict in app01/views.py 49 50 表示app01/views.py存在沖突需要解決,此時文件內容為: 51 52 from django.shortcuts import render,HttpResponse 53 54 def index(request): 55 return render(request,'index.html') 56 57 def africa(request): 58 <<<<<<< Updated upstream: # 修復Bug時更改的內容 59 return HttpResponse('非洲xxxx區') 60 ======= # 修復Bug前正在開發新功能時的內容 61 return HttpResponse('非洲專區') 62 63 def live(request): 64 print('剛開發到一半') 65 return HttpResponse('直播功能') 66 >>>>>>> Stashed changes 67 68 69 需要自行解決沖突,然后繼續開發,如: 70 71 from django.shortcuts import render,HttpResponse 72 73 def index(request): 74 return render(request,'index.html') 75 76 def africa(request): 77 78 return HttpResponse('非洲xxxx區') 79 80 def live(request): 81 print('剛開發到一半') 82 return HttpResponse('直播功能') 83?
stash相關常用命令:
- git stash ? ? ? ? ? ? 將當前工作區所有修改過的內容存儲到“某個地方”,將工作區還原到當前版本未修改過的狀態
- git stash list ? ? ? ?查看“某個地方”存儲的所有記錄
- git stash?clear ? ? 清空“某個地方”
- git stash pop ? ? ? 將第一個記錄從“某個地方”重新拿到工作區(可能有沖突)
- git stash apply ? ? 編號, 將指定編號記錄從“某個地方”重新拿到工作區(可能有沖突)?
- git stash drop ? ? ?編號,刪除指定編號的記錄
方案二:branch
分支學習:branch稱為分支,默認僅有一個名為master的分支。一般開發新功能流程為:開發新功能時會在分支dev上進行,開發完畢后再合并到master分支。
1 MacBook-Pro-4:pondo wupeiqi$ git branch dev # 創建新分支,即:拷貝一份當前所在分支代碼到新分支 2 MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切換到dev分支 3 MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 開發功能 4 MacBook-Pro-4:pondo wupeiqi$ git status # 查看狀態,即:在dev分支修改了app01/views.py文件 5 On branch dev 6 Changes not staged for commit: 7 (use "git add <file>..." to update what will be committed) 8 (use "git checkout -- <file>..." to discard changes in working directory) 9 10 modified: app01/views.py 11 12 no changes added to commit (use "git add" and/or "git commit -a") 13 MacBook-Pro-4:pondo wupeiqi$ git add . # 將修改文件添加到版本庫的暫存區 14 MacBook-Pro-4:pondo wupeiqi$ git commit -m '新功能開發完畢' # 將暫存區的內容提交到當前所在分支,即:dev分支 15 [dev 32b40cd] 新功能開發完畢 16 file changed, 2 insertions(+) 17 MacBook-Pro-4:pondo wupeiqi$ git checkout master # 切換回master分支 18 Switched to branch 'master' 19 MacBook-Pro-4:pondo wupeiqi$ git merge dev # 將dev分支內容合并到master分支 20 Updating 0972f4b..32b40cd 21 Fast-forward 22 app01/views.py | 2 ++ 23 file changed, 2 insertions(+) 一般流程示例(上圖)?
學習參考上圖,小P也可以按照著這樣的流程進行開發,如果遇到上文開發到一般需要臨時修復Bug的情況,可以按照下圖的流程進行:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | 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????????????# 切換會master Switched to branch?'master' MacBook-Pro-4:pondo wupeiqi$ git merge bug??????????????????# 將bug分支內容合并到master分支,表示bug修復完畢,可以上線 Updating 0972f4b..f42f386 Fast-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。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | MacBook-Pro-4:pondo wupeiqi$ git remote add origin https://github.com/WuPeiqi/pondo.git???# 為地址起一個別名origin MacBook-Pro-4:pondo wupeiqi$ git push origin master??????????????# 將本地master分支內容以及版本信息推送到GitHub Username?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 -> master MacBook-Pro-4:pondo wupeiqi$ git push origin dev??????????????# 將本地dev分支內容以及版本信息推送到GitHub Counting 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中獲取并繼續開發,開發完事下班就下班回家。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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 0 Unpacking objects: 100% (31/31),?done. MacBook-Pro-4:github wupeiqi$?cd?pondo/ MacBook-Pro-4:pondo wupeiqi$ git Branch??????????????????????????????????????????# 默認獲取到得只有master分支 * master MacBook-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': wupeiqi Password?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拉去最新代碼,然后繼續開發。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | MacBook-Pro-4:pondo wupeiqi$ git checkout dev???????????????????????????????????# 切換到dev分支 Already on?'dev' MacBook-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 0 Unpacking objects: 100% (4/4),?done. From https://github.com/WuPeiqi/pondo ?* branch??????????? dev??????? -> FETCH_HEAD ???50e2169..9281447? dev??????? -> origin/dev Updating 50e2169..9281447 Fast-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中拉取,并繼續開發。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 0 Unpacking objects: 100% (3/3),?done. From https://github.com/WuPeiqi/pondo ?* branch??????????? dev??????? -> FETCH_HEAD ???150d891..65b6604? dev??????? -> origin/dev MacBook-Pro-4:pondo wupeiqi$ git merge origin/dev???????????????????????????????# 將版本庫的分支內容合并到工作區 Updating 150d891..65b6604 Fast-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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 用戶A: ????touch?4.py ????git add . ????git commit -m?'功能4' ????git push origin master 用戶B: ????touch?5.py ????git add . ????git commit -m?'功能5' ????git push origin master?# 報錯,因為GitHub中已經有人提交新代碼 ????git pull origin master ????git push origin master - 先 git fetch origin master 然后 git rebase origin/master ?再 git push origin master
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 用戶A: ????touch?4.py ????git add . ????git commit -m?'功能4' ????git push origin master 用戶B: ????touch?5.py ????git add . ????git commit -m?'功能5' ????git push origin master?# 報錯,因為GitHub中已經有人提交新代碼 ????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://用戶名:密碼@github.com? ? ? ? 自動添加配置命令:git config credential.helper store
cache:?
? ? ? ? 表示將用戶名和密碼保存在緩存中
? ? ? ? 第一次輸入過用戶名和密碼之后,用戶名和密碼就會保存在緩存中,默認超時時間是 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://用戶名:密碼@github.com/wupeiqi/xxx.git?
就醬紫,以后想到再加吧...
1 以斜杠“/”開頭表示目錄; 2 3 以星號“*”通配多個字符; 4 5 以問號“?”通配單個字符 6 7 以方括號“[]”包含單個字符的匹配列表; 8 9 以嘆號“!”表示不忽略(跟蹤)匹配到的文件或目錄;?
1 git tag -a v1.0 -m '版本介紹' 本地創建Tag 2 git show v1.0 查看 3 git tags -n 查看本地Tag 4 git tag -l 'v1.4.2.*' 查看本地Tag,模糊匹配 5 git tag -d v1.0 刪除Tag 6 git push origin :refs/tags/v0.2 更新遠程tag 7 git checkout v.10 切換tag 8 git fetch origin tag V1.2 9 10 git push origin --tags 11 git pull origin --tags 12 13 git clone -b v0.1?
轉載于:https://www.cnblogs.com/kiko0o0/p/9585249.html
總結
- 上一篇: Centos yum install和y
- 下一篇: Python 字符串大小写转换