當我第一次使用git的時候矛洞,我的內(nèi)心是拒絕的洼哎。第一次合并代碼的時候烫映,各種沖突搞的我焦頭爛額,但是當熟悉使用git之后噩峦,覺得已經(jīng)離不開它了锭沟,git真是是一個工作的好幫手。
關于git的介紹识补,配置族淮,使用,下面的這兩份教程講的也很詳細凭涂,git其實內(nèi)容很多祝辣,很強大,而我們平時工作中用于管理代碼只是使用了很少的一部分功能切油。
如果你對git還不熟悉蝙斜,看完這兩份教程,對git會有一個全面的了解澎胡,但是如何在具體的工作場景中使用可能還不知如何下手孕荠,我自己總結(jié)了平時工作中常用的命令,以及使用場景滤馍,分享一下岛琼。
<a title="Yahoo Search"> Pro Git(中文版) </a>
<a title="Yahoo Search"> Git 入門教程 </a>
場景一:當新建一個倉庫底循,如何把倉庫和本地建立起鏈接巢株。
這里我以碼云為例,當你在碼云新建一個倉庫之后熙涤。碼云上會給你提供倉庫的地址阁苞,會有兩個地址HTTPS和SSH,github也是一樣的祠挫。
關于密鑰的配置這里就不說了那槽,我只記錄一些命令行的使用。
第一步:添加遠程倉庫地址
git remote add origin git@github.com:JasonSparrow/BeautyImage.git
當你執(zhí)行完這個命令可能會報錯remote origin already exists
等舔,意思就是你添加的這個origin已經(jīng)存在骚灸,此時需要執(zhí)行git remote remove origin
,移除origin慌植,然后再次執(zhí)行git remote add origin git@github.com:JasonSparrow/BeautyImage.git
甚牲,這樣就成功了。
第二步:把本地的工程push到遠程的倉庫蝶柿。
先執(zhí)行
git push -u origin master
如果報錯,則使用 git pull origin master
, 把遠程的先同步到本地丈钙,再次使用git push -u origin master
即可
如果看到這個內(nèi)容,那你就成功的把本地的內(nèi)容push到遠端了交汤。
場景二:分支創(chuàng)建與合并
git branch 分支名 //創(chuàng)建一個新的分支
git checkout 分支名 //切換分支
以上兩步等同于
git checkout -b 分支名 //新建分支雏赦,并切換過去
把新建的分支push到遠端
git push origin 分支名
這樣你的同事就可以看到你新建的分支了,此時你的同事就可以把這個遠端的分支拉取到本地。對于你和同事來說星岗,你們兩個人此時都有一個名稱相同的本地分支填大,假設分支名稱為1.0.0。
對于git的分布式版本管理來說俏橘,它是鼓勵你多建分支栋盹。因為1.0.0是大家共有的一個分支,它所負責的功能就是我們把1.0.0分支的修改拉取到本地與本地的合并敷矫,然后例获,再把合并好的1.0.0在推到遠端。每次在1.0.0上執(zhí)行pull曹仗,merge 榨汤,push操作時,我們每一個開發(fā)者都必須保證1.0.0是完全正確的怎茫,因為你的修改會影響到你的同事收壕,如果你這邊合并代碼之后,把他推到了遠端轨蛤,你的同事又把代碼拉取到本地蜜宪,此時發(fā)現(xiàn)代碼不能運行了,而別人還要等待你把錯誤的代碼修改好祥山,再次拉取正確的代碼才能工作圃验。這樣就會影響其他人工作。
所以缝呕,不建議直接在大家共有的1.0.0上直接進行代碼修改澳窑,而是大家都基于1.0.0分支各自再新建一個屬于自己的本地分支,假設同事A可以新建一個a_1.0.0供常,同事B可以新建一個b_1.0.0摊聋,我們每次只在自己的本地分支上修改,而不去修改大家共有的1.0.0栈暇,當我們把在本地分支上完成了本次修改麻裁,此時與1.0.0合并。然后push到遠端的倉庫源祈。這樣做并不能避免出錯煎源,只不過是減少了出錯的概率。
分支修改與合并
1新博、分支提交
對于我們開發(fā)某一個比較復雜的功能薪夕,也許不能一次把所有的功能都開發(fā)完,此時可以把一個功能拆分為不同的幾個小的功能赫悄。每完成一個小的功能我們就執(zhí)行一次提交原献,同多建分支一樣馏慨,我們也應該多次提交,這樣做方便與日后查看每次的提交內(nèi)容與某次提交出錯恢復在某次正確的提交姑隅。后面會講到写隶。千萬不要一下子修改了幾百個文件一下提交。這樣做如果出錯讲仰,對于自己和其他同事來說都是災難慕趴。
提交文件
git add 文件名//把修改的文件提交到暫存區(qū)
git commit -m "填寫你提交的日志"http://把暫存區(qū)的內(nèi)容提交到倉庫
git add
是提交單個文件,如果想一次提交所有文件可使用git add .
鄙陡,這樣就一次提交了所有的修改文件冕房。如果想撤銷本次的add 文件可使用git reset HEAD 文件名
, 撤銷添加到暫存區(qū)的文件
另外再次說一個概念,對于剛接觸git的同學來說趁矾,可能對于添加這個概念會有所誤解耙册。因為git每次保存的是你添加的內(nèi)容的一個指針,或者說你修改的一個指針毫捣。如果你新建文件详拙,這個叫做添加了文件或者修改了文件,你刪除了了文件這也叫添加了文件蔓同,刪除也是一種添加饶辙。
2、分支合并
工作中分支合并分為兩種情況
1斑粱、把另外一個分支合并到當前分支
2弃揽、把當前分支合并到另外一個分支
兩者的區(qū)別在于是否把當前的分支當做最終的合并后的版本。
假如現(xiàn)在本地有兩個分支1.0.0和a_1.0.0兩個分支珊佣。我們在a_1.0.0分支上開發(fā)新的功能蹋宦,提交修改到倉庫。此時需要把a_1.0.0分支合并到1.0.0分支咒锻。首先先使用git checkout branch
切換到1.0.0分支,然后執(zhí)行git merge a_1.0.0
命令守屉,就把a_1.0.0分支合并到1.0.0分支了惑艇。如果沒有沖突的,此時你就完成了本次合并拇泛。這種方式就是第一種合并方式滨巴,把另外一個分支合并到當前分支。
關于第二種合并方式俺叭,把當前分支合并到另外一個分支,我沒有用過終端命令,只在xcode自帶的版本管理操作過沈撞。xcode里面執(zhí)行merge from就是把一個分支合并到當前分支,執(zhí)行merge into就是把當前分支合并到另外一個分支耗跛。
場景三:回退到某次提交
1.穿越,回到過去
比如說你修改了某些文件攒发,但是中途發(fā)現(xiàn)這樣修改不好调塌,想要重新設計,對于此時來說惠猿,我們需要回到我們想要回到的那次修改的地方羔砾。也許有的人會覺得,我記住每次修改的內(nèi)容偶妖,把修改的刪除不就可以了嗎姜凄,如果你記憶力非常好,那沒問題趾访。但是如果修改的還有storyboard文件檀葛,如果修改的東西比較多,你能確保完全記得住腹缩,好記性不如一個爛筆頭屿聋。git 就是一個爛筆頭。
首先在終端里面輸入git log藏鹊, 會打印出最近的一些提交記錄润讥,這也是為甚說要多次提交,這也便于我們進行回退盘寡。
wangtengfeideMacBook-Pro:EasyMother Jason$ git log
commit 415f5d328fc73cf86dfad61fb423fdf61ff6541a
Author: 小飛hub <2678199009@qq.com>
Date: Thu Dec 8 18:09:22 2016 +0800
修改背景顏色
commit 1e44117e056517d14a1f5aceaf2e78269179e6ea
Author: 小飛hub <2678199009@qq.com>
Date: Thu Dec 8 17:27:21 2016 +0800
修改找月嫂背景顏色
commit 2292b7cfe68311ff3230d66eb9ada86b2f23e472
Author: 小飛hub <2678199009@qq.com>
Date: Thu Dec 8 17:23:19 2016 +0800
去除月嫂說
commit 039be98fe4e26f4c0ce603abf97ea64a4d8a6932
Author: 小飛hub <2678199009@qq.com>
Date: Thu Dec 8 17:18:40 2016 +0800
修改版本號
commit 4d30dd1f7a7bb7074822fd1f4c534f5ef86abfb6
Author: 小飛hub <2678199009@qq.com>
Date: Thu Dec 8 10:42:21 2016 +0800
提問專區(qū):標題改為選擇性填寫(不強制填寫)
commit 11a3adb47133959bce7ac6c7d612aa19046611be
假如此時我們想回退到修改版本號的地方git reset --hard 提交標記
回到修改版本號楚殿,如下所示
wangtengfeideMacBook-Pro:EasyMother Jason$ git reset --hard 039be98fe4e26f4c0ce603abf97ea64a4d8a6932 //修改版本號
然后就可以回退到修改版本號的地方,但此時在修改版本號以后的所有提交內(nèi)容也同樣會被清除掉竿痰。使用此命令需小心脆粥。
2.重返未來
重返未來和回到過去正好相反,前者回到以前的某次提交影涉,后者是回到未來的某次提交变隔。
剛才說到,執(zhí)行git reset --hard 提交標記
命令蟹倾,會把這次提交之后的所有提交都會清除掉匣缘。假如你不消息誤操作執(zhí)行了這個命令,發(fā)現(xiàn)自己辛辛苦苦的工作一下都白費了鲜棠,要回到你當前提交版本的未來的某次提交(前提條件是你執(zhí)行了git reset --hard 提交標記
肌厨,要不然,也不會有未來的提交)
首先在終端輸入git reflog
會打印出你最近操作的所欲的提交豁陆,合并等的記錄柑爸,如下(我只粘貼了一部分)
wangtengfeideMacBook-Pro:EasyMother Jason$ git reflog
c23f857 HEAD@{0}: reset: moving to c23f857
072c19b HEAD@{1}: reset: moving to 072c19bd6612ac680d7238ea3b593f279d54053f
c23f857 HEAD@{2}: commit: 添加注釋
072c19b HEAD@{3}: merge J_3.3.0: Fast-forward
a92613e HEAD@{4}: checkout: moving from J_3.3.0 to 3.3.0
072c19b HEAD@{5}: commit: 改為http請求
415f5d3 HEAD@{6}: commit: 修改背景顏色
1e44117 HEAD@{7}: commit: 修改找月嫂背景顏色
2292b7c HEAD@{8}: commit: 去除月嫂說
039be98 HEAD@{9}: commit: 修改版本號
f551e33 HEAD@{10}: commit: 緊急修復下單不能選擇地址的問題
2657843 HEAD@{11}: reset: moving to 26578435c6580b11472b4188e6027f3a695bf6df
23f84ea HEAD@{12}: commit: 添加聯(lián)系人地址
2657843 HEAD@{13}: commit: 用戶點擊自己頭像自動轉(zhuǎn)跳至時光中心
14f54dc HEAD@{14}: commit: 莫名其妙的會出現(xiàn)一根線
4d30dd1 HEAD@{15}: commit: 提問專區(qū):標題改為選擇性填寫(不強制填寫)
11a3adb HEAD@{16}: commit: 處理鍵盤通知
d12a83f HEAD@{17}: commit: 提問專區(qū)篩選箭頭圖標往右移,選中后顯示#FC7B99盒音,選了什么對應什么表鳍,
ee52989 HEAD@{18}: commit: 社區(qū)
6ef1f76 HEAD@{19}: commit: 社區(qū)搜搜
fc8457b HEAD@{20}: commit: 媽媽說點擊事件
ca39108 HEAD@{21}: commit: 月嫂說模塊
d4450b3 HEAD@{22}: commit: 媽媽說
4de8acf HEAD@{23}: commit: 查看大圖,添加中間的間隙
:
如剛才所說馅而,我們進行回退,回到了修改版本號的地方进胯,此時我們不想回到修改版本號的地方了用爪,我們想回到添加注釋的地方,如下
git reset --hard c23f857 //c23f857 HEAD@{2}: commit: 添加注釋
這樣就可以回到添加注釋的那次提交胁镐,在修改版本號和添加注釋直接的所有提交也會被恢復偎血。
場景四:文件暫存
假如我們本地有兩個分支,a和b盯漂,此時我們在b分支上正在開發(fā)功能颇玷,每次開發(fā)一部分就合并到a分支上,但是此時你的同事發(fā)現(xiàn)你合并的a分支有一個問題就缆,很嚴重帖渠,已經(jīng)影響了同事工作了,此時需要你緊急修復下竭宰。但是你在b分支上開發(fā)的功能才完成了一部分空郊,還有很多錯誤,此時又不想提交切揭。這個時候就可以先使用暫存狞甚,先把當前分支的修改暫存,切換到其他分支工作廓旬,然后在切換到暫存的分支哼审,把暫存區(qū)的內(nèi)容恢復,繼續(xù)開發(fā)孕豹。
首先在b分支上執(zhí)行
git stash //把工作現(xiàn)場暫存
此時你就可以切換到a分支進行bug修復了
當bug修復完成涩盾,然后切換到b分支,執(zhí)行
git stash pop //回到工作現(xiàn)場
場景五:恢復已經(jīng)刪除的本地分支步
這里說下我曾經(jīng)遇到的一個比較大的坑励背。由于修改的文件比較多春霍,在合并之前猜測就會產(chǎn)生很麻煩的沖突,所以椅野,我又建了一個分支终畅,用于合并測試。由于同事之間修改的Project文件內(nèi)容太多竟闪,導致Project文件沖突,在解決沖突時出了問題杖狼,當時猜測是把文件的引用給刪掉了炼蛤。導致合并失敗,一氣之下蝶涩,直接把用于測試的分支給強制刪除了理朋。本想著絮识,再建一個分支,再次合并嗽上。但是次舌,git卻告訴我,有一個未完成合并的分支兽愤,讓我必須完成合并才能繼續(xù)其他的操作彼念,一下我就懵逼了。
搞了一個上午才修復浅萧。其實也很簡單逐沙,只需要兩步就可以了。
1.使用git log -g 找回之前提交的commit
git log -g
這個命令是讓你找到你刪除的分支的某一次提交記錄洼畅,我在刪除的分支上進行了一次提交
develop
wangtengfeideMacBook-Pro:EasyMother Jason$ git log -g
commit c23f857a1a08f338fe9b28e7bdbeb7da05586477
Reflog: HEAD@{0} (小飛hub <2678199009@qq.com>)
Reflog message: checkout: moving from JJ_3.3.0 to 3.3.0
Author: 小飛hub <2678199009@qq.com>
Date: Mon Dec 12 09:16:38 2016 +0800
添加注釋
commit 16201fcd6f2e5644f6df0815ad233f995d8f0f6e
Reflog: HEAD@{1} (小飛hub <2678199009@qq.com>)
Reflog message: commit: 添加文件
Author: 小飛hub <2678199009@qq.com>
Date: Mon Dec 12 10:04:59 2016 +0800
添加文件
commit c23f857a1a08f338fe9b28e7bdbeb7da05586477
Reflog: HEAD@{2} (小飛hub <2678199009@qq.com>)
Reflog message: checkout: moving from 3.3.0 to JJ_3.3.0
Author: 小飛hub <2678199009@qq.com>
Date: Mon Dec 12 09:16:38 2016 +0800
添加注釋
wangtengfeideMacBook-Pro:EasyMother Jason$
我在刪除的JJ_3.3.0分支上進行了一次提交吩案,添加文件
git branch recover_branch_abc 16201fcd6f2e5644f6df0815ad233f995d8f0f6e
2.使用git branch recover_branch_新分支 commit_id命令用這個commit創(chuàng)建一個分支
git branch recover_branch_abc 16201fcd6f2e5644f6df0815ad233f995d8f0f6e //添加文件的commit_id
然后使用git branch
查看分支分支是否存在,如果成功將會出現(xiàn)一個新的分支recover_branch_abc帝簇,然后切換到recover_branch_abc分支徘郭,查看文件是否存在。
這樣就可以恢復被誤刪的分支了
場景六:刪除遠程分支
//分支名丧肴, 這樣做只是刪除了本地的遠程分支的索引
git branch -r -d origin/hotfix/2.2.3
//在執(zhí)行這句就完全刪除了(注意冒號残揉,要與origin留一個空格)
git push origin :hotfix/2.2.3
關于git合并代碼產(chǎn)生沖突的問題我要發(fā)發(fā)牢騷,以前找工作的時候闪湾,總是有一些人說冲甘,你們?yōu)槭裁词褂胹toryboard,而不是用純代碼途样,使用storyboard會影響程序編譯速度江醇,不利于團隊開發(fā)之類的。我從第一天開始工作就開始使用storyboard開發(fā)何暇,合并代碼陶夜,當然會產(chǎn)生沖突,但是產(chǎn)生沖突最后都可以解決裆站,你解決不了的沖突不代表別人不能解決条辟,storyboard本質(zhì)上就是一個xml文件,我只能說宏胯,不擁抱新技術的人始終會被淘汰羽嫡,整天代碼寫那些布局有意思嗎?storyboard來畫界面肩袍,真心速度比純代碼快很多杭棵。
文章內(nèi)容為自己平時使用git遇到的一些情況,如果您有更好的方式處理這些問題氛赐,請留言斧正魂爪。
git 配置RSA
https://www.cnblogs.com/superGG1990/p/6844952.html
首先 cd 切換到用戶的目錄 我的用戶名是hr, 那我就切換到hr下
然后執(zhí)行ssh-keygen -t rsa -C "your_email@youremail.com"
然后 cd ~/.ssh,
打印 cat id_rsa.pub