git的學(xué)習(xí)筆記-入門

PS:小白的入門筆記邻奠,希望能有用蚌卤,主要參考廖君Git教程

操作環(huán)境說明:

  • github倉(cāng)庫(kù) https://github.com/zhanghlHUST/figureForMarkdown周崭,作為名詞說明的示例
  • 本地工作區(qū) E:\github\figureForMarkdown
  • 操作系統(tǒng) win10 64位
  • Github Desktop 3.3.4.0
  • Windows PowerShell(x86) 運(yùn)行 Git Shell 作為命令行工具

參考:
廖君Git教程
git pro
圖解Git
知乎-分支操作的一些討論

簡(jiǎn)單粗暴的注意事項(xiàng):

  • 使用git checkout刪除工作區(qū)修改、撤銷刪除、切換分支時(shí)檩互,一定要注意備份當(dāng)前工作區(qū)的內(nèi)容粹胯,git會(huì)采用倉(cāng)庫(kù)內(nèi)容直接更新工作區(qū)蓖柔,造成工作區(qū)修改的丟失

為什么學(xué) git ?

  • 版本控制风纠,git况鸣、CVS 及 SVN 都能做到
  • 分布式的合作開發(fā)的控制
  • github 的開放的資源

git 的版本控制

工作時(shí)從 版本庫(kù)中提取文件到 工作區(qū)進(jìn)行文件的創(chuàng)建、編輯竹观、修改镐捧、刪除等操作,工作 完成后提交至版本庫(kù)臭增,由版本庫(kù)跟蹤文件的修改歷史懂酱,所有的版本控制系統(tǒng) 只能跟蹤文本文件的改動(dòng),版本控制系統(tǒng)可以告訴你每次的改動(dòng)誊抛,如 txt 文件列牺、網(wǎng)頁、代碼等芍锚。而圖片昔园、視頻這些二進(jìn)制文件,雖然也能由版本控制系統(tǒng)管理并炮,但 沒法跟蹤二進(jìn)制文件的變化默刚,只能把二進(jìn)制文件每次改動(dòng)串起來,也就是只知道圖片從100KB改成了120KB逃魄,但到底改了啥荤西,版本控制系統(tǒng)不知道,也沒法知道伍俘。

知識(shí)結(jié)構(gòu)

git的知識(shí)結(jié)構(gòu)
git的知識(shí)結(jié)構(gòu)

后續(xù)學(xué)習(xí)任務(wù)

  • 結(jié)合《Falsk Web 開發(fā)》對(duì) git 在實(shí)際項(xiàng)目的控制過程進(jìn)行實(shí)戰(zhàn)邪锌,寫成總結(jié)
  • github 的正確使用姿勢(shì),寫成總結(jié)
  • git 的底層機(jī)制的學(xué)習(xí)癌瘾,特別是 diff觅丰,checkoutreset妨退,branch妇萄,commit 這幾個(gè)概念的深入理解蜕企,寫成總結(jié)

工作區(qū)及版本庫(kù)的概念

github概念
github概念
  • 工作區(qū): 就是你在電腦里能看到的目錄,即 E:\github\figureForMarkdown
  • 版本庫(kù): 工作區(qū)有一個(gè)隱藏目錄.git冠句,即本地的Git的版本庫(kù)轻掩,當(dāng)前倉(cāng)庫(kù)下,如果沒有任何的提交懦底,那么版本庫(kù)就是對(duì)應(yīng)上次提交后的內(nèi)容唇牧。主要包含暫存區(qū)index,git自動(dòng)創(chuàng)建的第一個(gè)分支master以及指向master的指針HEAD
本地版本庫(kù)文件列表
本地版本庫(kù)文件列表
  • 暫存區(qū): git的版本庫(kù)里面最重要的就是稱為stage(或index)的暫存區(qū)聚唐,實(shí)際上就是一個(gè)包含文件索引的目錄樹丐重,像是一個(gè)虛擬的工作區(qū)。在這個(gè)虛擬工作區(qū)的目錄樹中拱层,記錄了文件名弥臼、文件的狀態(tài)信息(時(shí)間戳、文件長(zhǎng)度等)根灯,文件的內(nèi)容并不存儲(chǔ)其中,而是保存在Git對(duì)象庫(kù)(.git/objects)中掺栅,文件索引建立了文件和對(duì)象庫(kù)中對(duì)象實(shí)體之間的對(duì)應(yīng)烙肺。如果當(dāng)前倉(cāng)庫(kù),有文件更新氧卧,并且使用git add命令桃笙,那么這些更新就會(huì)出現(xiàn)在暫存區(qū)中。

操作

創(chuàng)建版本庫(kù)(by shell)

  • 首先沙绝,選擇一個(gè)合適的地方搏明,創(chuàng)建一個(gè)空目錄,mkdir learngit,cd learngit,pwd OUTPUT: E:\github\learngit闪檬,windows系統(tǒng)中各級(jí)目錄名中最好不要使用中文
  • 通過git init 將該目錄編程git可以管理的倉(cāng)庫(kù)星著,OUTPUT: Initialized empty Git repository in E:/github/learngit/.git/,至此倉(cāng)庫(kù)生成目錄下包含 .git 目錄用來跟蹤管理版本庫(kù)粗悯。ls -ah 查看隱藏的.git文件

創(chuàng)建版本庫(kù)(by desktop)

+->Create-> 選擇 Namelocal path -> Create repository

添加文件到版本庫(kù) (by shell)

git add命令實(shí)際上就是把要提交的所有修改放到暫存區(qū)(Stage)虚循,然后,執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支样傍。一旦提交后横缔,如果你又沒有對(duì)工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的衫哥,git status查看

  • 在工作區(qū) E:\github\learngit中創(chuàng)建 readme.txt 文件茎刚,編輯輸入:
Git is a version control system.
Git is free software. 
  • 使用git add readme.txt 添加文件至倉(cāng)庫(kù)(暫存區(qū)index以及objects)。沒有輸出表示操作成功撤逢,可反復(fù)多次使用膛锭,可以同時(shí)添加多個(gè)文件拆挥;
  • 使用git commit -m 'wrote a readme file'將文件提交至當(dāng)前分支阁吝,并添加描述信息,會(huì)顯示分支當(dāng)前的狀態(tài)與暫存區(qū)的比較結(jié)果,-m后為本次提交說明

添加文件到版本庫(kù) (by Desktop)

Desktop沒有先add到暫存區(qū)缺菌,然后commit到分支的概念,文件編輯后洛退,直接查看 changes 查看文件的變化般甲,勾選需要提交的變化,輸入comment summary and descriptipn 提交

修改文件 (by Shell)

  • git status 命令可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài)俊马。
  • 工作區(qū)文件與倉(cāng)庫(kù)完全一致時(shí)丁存,git status結(jié)果為:
On branch master
nothing to commit, working tree clean
即 沒有待提交內(nèi)容,工作目錄是干凈的
  • 工作區(qū)文件改變柴我,如上修改 readme.txt, 改為 Git is a distributed version control system., git status結(jié)果為:
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 dir

        modified:   reademe.txt

no changes added to commit (use "git add" and/or "git commit -a")
 即 文件被修改解寝,但是還未準(zhǔn)備提交修改
  • 工作區(qū)文件修改,并git add提交至緩存區(qū)艘儒,git status結(jié)果為:

修改文件 (by Desktop)

與添加文件操作完全一致聋伦,客戶端不嚴(yán)格區(qū)分暫存區(qū)與工作區(qū)

歷史版本的操作

像這樣,你不斷對(duì)文件進(jìn)行修改界睁,然后不斷提交修改到版本庫(kù)里觉增,就好比玩RPG游戲時(shí),每通過一關(guān)就會(huì)自動(dòng)把游戲狀態(tài)存盤翻斟,如果某一關(guān)沒過去逾礁,你還可以選擇讀取前一關(guān)的狀態(tài)。有些時(shí)候访惜,在打Boss之前嘹履,你會(huì)手動(dòng)存盤,以便萬一打Boss失敗了债热,可以從最近的地方重新開始砾嫉。Git也是一樣,每當(dāng)你覺得文件修改到一定程度的時(shí)候阳柔,就可以“保存一個(gè)快照”焰枢,這個(gè)快照在Git中被稱為commit。一旦你把文件改亂了舌剂,或者誤刪了文件济锄,還可以從最近的一個(gè)commit恢復(fù),然后繼續(xù)工作霍转,而不是把幾個(gè)月的工作成果全部丟失荐绝。

查看歷史紀(jì)錄(by Shell)
  • git log命令顯示從最近到最遠(yuǎn)的提交日志,可以看到兩次操作,分別是創(chuàng)建文件避消,及修改文件低滩,
  • git log --pretty=online 整理輸出信息
將倉(cāng)庫(kù)撤回到指定版本

首先召夹,Git必須知道當(dāng)前版本是哪個(gè)版本,在Git中恕沫,用HEAD表示當(dāng)前版本监憎,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣),上一個(gè)版本就是HEAD婶溯,上上一個(gè)版本就是HEAD鲸阔,當(dāng)然往上100個(gè)版本寫100個(gè)比較容易數(shù)不過來,所以寫成HEAD~100迄委。也可以直接使用 git log顯示的 commit 版本號(hào)褐筛,且版本號(hào)沒必要寫全,前幾位就可以了叙身,Git會(huì)自動(dòng)去找渔扎。

  • git reflog 查看歷史commit的版本號(hào)
  • 參照廖君Git教程 設(shè)置三次提交
  • git reset --hard HEAD^ 將文件撤回到 add distributed 版本,并且 git log查看信轿,add GPL已經(jīng)消失晃痴,
  • git的版本撤回是將HEAD指針的指向,并更新工作區(qū)的文件虏两。
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 14:53:12 2013 +0800

    add distributed

commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 19 17:51:55 2013 +0800

    wrote a readme file
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..."

        modified:   reademe.txt
  即 文件被修改愧旦,待提交
查看文件的對(duì)比區(qū)分
  • git diff 查看緩存區(qū)與工作區(qū)的文件的改變細(xì)節(jié)。
撤銷修改
撤銷工作區(qū)的修改(by Shell)
  • 當(dāng)工作區(qū)的文件修改且該修改并未提交到暫存區(qū)定罢,git checkout -- file 可以丟棄工作區(qū)的修改
  • 當(dāng)工作區(qū)的文件修改已經(jīng)提交到暫存區(qū),又做了修改旁瘫,git checkout -- file撤銷修改就回到添加到暫存區(qū)后的狀態(tài)祖凫。
  • 就是讓這個(gè)文件回到最近一次 git commitgit add 時(shí)的狀態(tài)。git checkout其實(shí)是用版本庫(kù)里的版本替換工作區(qū)的版本酬凳,無論工作區(qū)是修改還是刪除惠况,都可以“一鍵還原”
撤銷暫存區(qū)的修改(by Shell)
  • git reset HEAD file 可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)
撤銷工作區(qū)及暫存區(qū)的修改(by Desktop)
  • Destop 并未嚴(yán)格區(qū)分工作區(qū)與暫存區(qū)宁仔,changes -> 選擇指定的修改 -> discard changes
撤銷提交到本地版本庫(kù)的修改(by Shell)
  • 上文中的將倉(cāng)庫(kù)撤回指定版本的操作稠屠,git reset --hard 版本號(hào)
撤銷提交到本地版本庫(kù)的修改(by Desktop)
  • History -> 選擇指定的提交 -> revert
刪除文件(by Shell)
  • git rm 相當(dāng)于手動(dòng)刪除文件并提交至?xí)捍鎱^(qū),然后 git commit -m "commit"至本地版本庫(kù)
  • git checkout -- file 恢復(fù)誤刪的文件
刪除文件(by Desktop)
  • 手動(dòng)刪除文件 -> changes -> 提交修改到版本庫(kù)

本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)

github工作流程
github工作流程
  • 遠(yuǎn)程倉(cāng)庫(kù)就是在公網(wǎng)服務(wù)器上的倉(cāng)庫(kù)(repository)翎苫,即 https://github.com/zhanghlHUST/figureForMarkdown权埠,Git是分布式版本控制系統(tǒng), 同一個(gè)Git倉(cāng)庫(kù)煎谍,可以分布到不同的機(jī)器上攘蔽,找一臺(tái)電腦充當(dāng)服務(wù)器的角色,每天24小時(shí)開機(jī)呐粘,其他每個(gè)人都從這個(gè)“服務(wù)器”倉(cāng)庫(kù)克隆一份到自己的電腦上满俗,并且各自把各自的提交推送到服務(wù)器倉(cāng)庫(kù)里转捕,也從服務(wù)器倉(cāng)庫(kù)中拉取別人的提交。Github用來提供Git倉(cāng)庫(kù)的托管服務(wù)唆垃,注冊(cè)一個(gè)Github賬號(hào)就免費(fèi)獲得Git遠(yuǎn)程倉(cāng)庫(kù)五芝。

操作

設(shè)置 SSH-Key

github官網(wǎng) 頭像下拉 -> Settings -> SSH and GPG keys -> SSH keys

創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)

在本地創(chuàng)建了一個(gè)Git倉(cāng)庫(kù)后,可以在GitHub創(chuàng)建一個(gè)Git倉(cāng)庫(kù)辕万,并且讓這兩個(gè)倉(cāng)庫(kù)進(jìn)行遠(yuǎn)程同步枢步,這樣,GitHub上的倉(cāng)庫(kù)既可以作為備份蓄坏,又可以讓其他人通過該倉(cāng)庫(kù)來協(xié)作价捧,github上的倉(cāng)庫(kù)是公開的,可以選擇繳費(fèi)或者自己搭建遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器的方式創(chuàng)建私有的倉(cāng)庫(kù)涡戳。

github官網(wǎng) -> + -> new repository -> 輸入Repository name -> 不要選 Initialize this repository with a README

為本地倉(cāng)庫(kù)添加遠(yuǎn)程倉(cāng)庫(kù)(by Shell)

在本地倉(cāng)庫(kù)運(yùn)行 -> git remote add origin https://github.com/zhanghlHUST/learngit.git (添加后遠(yuǎn)程庫(kù)的名字是origin)

為本地倉(cāng)庫(kù)添加遠(yuǎn)程倉(cāng)庫(kù)(by Desktop)

右上角Publish -> 輸入 NameDescription -> 下拉選擇 github 賬號(hào) -> Publish repository结蟋,之后按鈕 Publish 會(huì)轉(zhuǎn)變成 Sync

推送本地倉(cāng)庫(kù)內(nèi)容到遠(yuǎn)程倉(cāng)庫(kù)(by Shell)

把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,用git push命令渔彰,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程嵌屎。
由于遠(yuǎn)程庫(kù)是空的,我們 第一次推送master分支時(shí)恍涂,加上了-u參數(shù)宝惰,Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來再沧,此后尼夺,每次本地提交后,只要有必要炒瘸,就可以使用命令git push origin master推送最新修改

在本地倉(cāng)庫(kù)運(yùn)行 -> git push -u origin master
在本地倉(cāng)庫(kù)運(yùn)行 -> git push origin devdev 分支推送至遠(yuǎn)程倉(cāng)庫(kù) origin

什么分支需要推送淤堵?
  • master分支是主分支,因此要時(shí)刻與遠(yuǎn)程同步顷扩,保存程序的發(fā)行版本拐邪。
  • dev分支是開發(fā)分支,保存程序的主要開發(fā)版本隘截,團(tuán)隊(duì)所有成員都需要在上面工作扎阶,所以也需要與遠(yuǎn)程同步;
  • bug分支只用于在本地修復(fù)bug婶芭,就沒必要推到遠(yuǎn)程了东臀,除非老板要看看你每周到底修復(fù)了幾個(gè)bug
  • feature分支是否推到遠(yuǎn)程雕擂,取決于你是否和你的小伙伴合作在上面開發(fā)啡邑。

推送本地倉(cāng)庫(kù)內(nèi)容到遠(yuǎn)程倉(cāng)庫(kù)(by Desktop)

右上角Sync,完全同步本地庫(kù)與遠(yuǎn)程庫(kù)井赌,讓兩者保持一致谤逼,功能單一

創(chuàng)建遠(yuǎn)程 orgindev 分支到本地

git checkout -b dev origin/devdev分支上協(xié)作開發(fā)贵扰,就必須創(chuàng)建遠(yuǎn)程origindev分支到本地

從遠(yuǎn)程庫(kù)克隆創(chuàng)建本地倉(cāng)庫(kù)(by Shell)

在本地倉(cāng)庫(kù)運(yùn)行 -> git clone git@github.com:zhanghlHUST/learngit.git, 當(dāng)從遠(yuǎn)程倉(cāng)庫(kù)克隆時(shí),實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對(duì)應(yīng)起來了流部,并且戚绕,遠(yuǎn)程倉(cāng)庫(kù)的默認(rèn)名稱是origin

從遠(yuǎn)程庫(kù)克隆創(chuàng)建本地倉(cāng)庫(kù)(by Desktop)

+ -> Clone -> 選擇 repository -> Clone repositoty -> 選擇本地倉(cāng)庫(kù)目錄

查看遠(yuǎn)程庫(kù)的信息 (by Shell)

git remote, git remote -v 查看遠(yuǎn)程庫(kù)的詳細(xì)信息

合作開發(fā)的控制

分支的概念

引用 Git 分支 - 利用分支進(jìn)行開發(fā)的工作流程

  • 合作開發(fā)的控制: 可以同時(shí)擁有多個(gè)開放的分支,每個(gè)分支用于完成特定的任務(wù)枝冀,隨著開發(fā)的推進(jìn)舞丛,可以隨時(shí)把某個(gè)特性分支的成果并到其他分支中。
穩(wěn)定性分支示意圖
穩(wěn)定性分支示意圖
  • 維護(hù)不同程度的穩(wěn)定性:通常在master分支中保留完全穩(wěn)定的代碼(通常是已經(jīng)發(fā)布或者即將發(fā)布的代碼)果漾,與此同時(shí)還有一個(gè)名為 master 或者 next 的分支 專門用于后續(xù)的開發(fā)或者測(cè)試球切,當(dāng) next 的新特性一旦進(jìn)入某種穩(wěn)定狀態(tài),就可以將新特性合并到master绒障,同樣設(shè)置 針對(duì)具體問題的特性分支(短期分支) topic吨凑,在確保指定特性分支能夠通過所有測(cè)試之后將其合并到主干分支,等待后續(xù)的發(fā)布户辱。
特性分支示意圖
特性分支示意圖
  • 如上圖由下往上鸵钝,起先我們?cè)?master 工作到 C1,然后開始一個(gè)新分支 iss91 嘗試修復(fù) 91 號(hào)缺陷庐镐,提交到 C6 的時(shí)候恩商,又冒出一個(gè)解決該問題的新辦法,于是從之前 C4 的地方又分出一個(gè)分支 iss91v2必逆,干到 C8 的時(shí)候怠堪,又回到主干 master 中提交了 C9C10,再回到 iss91v2 繼續(xù)工作名眉,提交 C11研叫,接著,又冒出個(gè)不太確定的想法璧针,從 master 的最新提交 C10 處開了個(gè)新的分支 dumbidea 做些試驗(yàn)。現(xiàn)在渊啰,假定兩件事情:我們最終決定使用第二個(gè)解決方案探橱,即 iss91v2 中的辦法;另外绘证,我們把 dumbidea 分支拿給同事們看了以后隧膏,發(fā)現(xiàn)它竟然是個(gè)天才之作。所以接下來嚷那,我們準(zhǔn)備拋棄原來的 iss91 分支(實(shí)際上會(huì)丟棄 C5C6)胞枕,直接在主干中并入另外兩個(gè)分支
    分支合并結(jié)果
    分支合并結(jié)果
  • 特性分支 在任何規(guī)模的項(xiàng)目中都可以使用特性分支。一個(gè)特性分支是指一個(gè)短期的魏宽,用來實(shí)現(xiàn)單一特性或與其相關(guān)工作的分支腐泻,該技術(shù)允許你迅速且完全的進(jìn)行語境切換决乎,工作將分散在不同的流水線上,每個(gè)分支都有特定的目標(biāo)特性派桩。

操作

創(chuàng)建分支(by Shell)

git branch dev 創(chuàng)建分支dev构诚,無輸出

創(chuàng)建分支(by Desktop)

點(diǎn)擊branch前的分支按鈕 -> 輸入 Name -> 選擇 From branch -> Create new branch

切換分支(by Shell)

從當(dāng)前的提交之后創(chuàng)建分支

git checkout dev 切換到分支dev,輸出 Switched to branch 'dev'
git checkout -b dev 創(chuàng)建并切換到 dev 分支铆惑,輸出 Switched to a new branch 'dev'

切換分支(by Desktop)

點(diǎn)擊當(dāng)前分支名稱旁的下拉按鈕范嘱,選擇分支

不同分支的內(nèi)容的可見性(by Shell)

不同的分支管理不同的commit,commit之間通過地址單向訪問,繼而限制了不同分支的可見性员魏,git checkout branchName 切換到不同分支之后丑蛤,工作區(qū)的文件內(nèi)容會(huì)自動(dòng)更新。注意備份工作區(qū)的修改

查看分支(by Shell)

git branch 查看分支列表

合并分支(by Shell)

dev并入master

  • 切換到 master分支撕阎,git checkout master
  • 合并 dev 分支到當(dāng)前分支受裹,git merge dev

合并分支(by Desktop)

切換到 master -> compare -> 選取待合并的目標(biāo)分支 -> update from target branch

合并方式
  • Fast-forward,“快進(jìn)模式”闻书,也就是直接把master指向dev的當(dāng)前提交名斟,所以合并速度非常快
合并沖突
  • 設(shè)想情景魄眉,在 commit n 之后創(chuàng)建分支 dev砰盐,提交修改 commit n+1,切換到 master 分支坑律,提交修改 commit n+2 岩梳,然后試圖將 dev 分支合并到 master時(shí)出現(xiàn)沖突,輸出 Auto-merging README.md \n CONFLICT (content): Merge conflict in README.md \n Automatic merge failed; fix conflicts and then commit the result.

  • 輸出:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

其中晃择,Git用<<<<<<<冀值,=======>>>>>>>標(biāo)記出不同分支的內(nèi)容宫屠。

  • 直接對(duì)沖突的文件進(jìn)行修改列疗,刪除不同分支沖突的內(nèi)容。
  • master分支提交修改浪蹂。
  • git log --graph --pretty=oneline --abbrev-commit 查看分支的合并情況

刪除分支 (by Shell)

git branch -d dev 刪除分支 dev

刪除分支 (by desktop)

切換到目標(biāo)分支 -> 右上角齒輪狀設(shè)置按鈕 -> Delete target_branch ...

查看分支合并情況 (by Shell)

git log --graph --pretty=oneline --abbrev-commit 查看分支的合并情況及相應(yīng)的提交

git 分支管理策略

團(tuán)隊(duì)合作分支策略

團(tuán)隊(duì)合作的分支策略
團(tuán)隊(duì)合作的分支策略
  • 首先抵栈,master分支應(yīng)該非常穩(wěn)定,僅用來發(fā)布新版本坤次,平時(shí)不能在上面干活古劲;
  • 干活都在 dev 分支上,即 dev 時(shí)不太穩(wěn)定的缰猴,更超前的产艾;
  • 不同的開發(fā)人員在不同的分支上進(jìn)行開發(fā),然后將性能穩(wěn)定的版本合并至 dev 版本上。

bug分支及當(dāng)前分支工作的stash儲(chǔ)藏功能

  • 情景 軟件開發(fā)中遇到 bug 時(shí)闷堡,每個(gè)bug都可以通過一個(gè)新的臨時(shí)分支來修復(fù)隘膘,修復(fù)后,合并分支缚窿,然后將臨時(shí)分支刪除棘幸。比如當(dāng)你接到一個(gè)修復(fù)一個(gè)代號(hào)101bug的任務(wù)時(shí),很自然地倦零,你想創(chuàng)建一個(gè)分支issue-101來修復(fù)它误续,但是,假如當(dāng)前正在dev上進(jìn)行的工作還沒有提交扫茅,并且當(dāng)前的工作仍在進(jìn)行中蹋嵌,不能提交,然而創(chuàng)建分支修改bug又勢(shì)在必行葫隙。此時(shí)創(chuàng)建分支修改bug后提交修改時(shí)栽烂,會(huì)將dev的內(nèi)容同時(shí)提交。此時(shí)需要stash保存工作現(xiàn)場(chǎng)恋脚。

操作

創(chuàng)建commit的合并方式 (by Shell)

合并分支時(shí)腺办,Git會(huì)盡可能采用 Fast forward 模式,在這種模式下糟描,刪除分支后怀喉,會(huì)丟掉分支信息。如果強(qiáng)行禁用 Fast forward 模式船响,Git就會(huì)在 merge 時(shí)生成一個(gè)新的 commit, 這樣分支歷史就可以看出分支信息躬拢。

工作現(xiàn)場(chǎng)stash的使用 (by Shell)

當(dāng)工作區(qū)的目標(biāo)不適合提交(正在開發(fā)或者是臟的提交)時(shí),使用 stash 保存快照见间,并進(jìn)行恢復(fù)聊闯,不過 stash 只保存改變的需要被跟蹤的文件,其他文件不會(huì)被跟蹤米诉×馐撸恢復(fù) stash 時(shí),若跟蹤的文件被修改史侣,會(huì)遇到?jīng)_突汗销。

  • git stash 保存工作現(xiàn)場(chǎng),此時(shí) git status 查看工作區(qū)沒有修改信息
  • git stash list 查看工作現(xiàn)場(chǎng)的列表
  • git stash apply stash@{id} 恢復(fù) stash@{id} 的內(nèi)容, git stash drop 刪除工作現(xiàn)場(chǎng)
  • git stash pop stash@{id} 恢復(fù) stash@{id} 的內(nèi)容同時(shí)刪除它

git merge --no-ff -m "merge message" dev 合并分支并提交merge信息

強(qiáng)行丟棄分支

git branch -D <name> 可以強(qiáng)行刪除未合并到主分支的特性分支

多人協(xié)作的工作方式

當(dāng)有沖突的時(shí)候抵窒,先用 git pull 把最新的提交從 origin/dev 抓下來,然后在本地合并叠骑,解決沖突李皇,再推送

  • 首先,可以試圖用git push origin branch-name推送自己的修改;
  • 如果推送失敗掉房,則因?yàn)檫h(yuǎn)程分支比你的本地更新茧跋,需要先用git pull抓取遠(yuǎn)程倉(cāng)庫(kù)的最新更新;
  • 如果git pull提示“no tracking information”卓囚,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建瘾杭,指定本地devorigin/dev分支的鏈接,git branch --set-upstream dev origin/dev
  • 然后本地的倉(cāng)庫(kù)中出現(xiàn)沖突哪亿,需要手動(dòng)解決粥烁,解決方式與分制管理中的解決沖突的方式一致。解決沖突提交到本地倉(cāng)庫(kù)蝇棉,
  • 推送到遠(yuǎn)程倉(cāng)庫(kù) git push origin dev

標(biāo)簽管理

tag就是一個(gè)讓人容易記住的有意義的名字讨阻,它跟某個(gè)commit綁在一起,一般給程序的不同版本設(shè)置標(biāo)簽篡殷,便于快速查找

操作

創(chuàng)建標(biāo)簽 (by Shell)

  • 切換到需要打標(biāo)簽的分支上 git checkout <branch name>
  • 創(chuàng)建標(biāo)簽 git tag <name> 對(duì)最新的提交打標(biāo)簽
  • 創(chuàng)建標(biāo)簽 git tag <tag name> <commit id> 給指定提交打標(biāo)簽
  • 創(chuàng)建有說明信息的標(biāo)簽 git tag -a <tagname> -m "tag message" <commit id>

查看所簽 (by Shell)

  • 列出所有標(biāo)簽 git tag钝吮, 標(biāo)簽的順序是字母順序,而不是時(shí)間順序
  • 查看標(biāo)簽的詳細(xì)信息 git show <tagname>

刪除標(biāo)簽 (by Shell)

  • 刪除本地倉(cāng)庫(kù)標(biāo)簽 git tag -d <tag name>
  • 刪除遠(yuǎn)程倉(cāng)庫(kù)的標(biāo)簽, 先刪除本地標(biāo)簽 git tag -d <tag name>板辽,然后刪除遠(yuǎn)程的標(biāo)簽 git push origin :refs/tags/v0.9

推送標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù) (by Shell)

  • 推送單個(gè)標(biāo)簽 git push <branch name> <tag name>
  • 一次性推送多個(gè)標(biāo)簽 git push origin --tags
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奇瘦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劲弦,更是在濱河造成了極大的恐慌耳标,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓶您,死亡現(xiàn)場(chǎng)離奇詭異麻捻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)呀袱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門贸毕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夜赵,你說我怎么就攤上這事明棍。” “怎么了寇僧?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵摊腋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我嘁傀,道長(zhǎng)兴蒸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任细办,我火速辦了婚禮橙凳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己岛啸,他們只是感情好钓觉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坚踩,像睡著了一般荡灾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞬铸,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天批幌,我揣著相機(jī)與錄音,去河邊找鬼赴捞。 笑死逼裆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赦政。 我是一名探鬼主播胜宇,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼恢着!你這毒婦竟也來了桐愉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤掰派,失蹤者是張志新(化名)和其女友劉穎从诲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靡羡,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡系洛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了略步。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片描扯。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖趟薄,靈堂內(nèi)的尸體忽然破棺而出绽诚,到底是詐尸還是另有隱情,我是刑警寧澤杭煎,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布恩够,位于F島的核電站,受9級(jí)特大地震影響羡铲,放射性物質(zhì)發(fā)生泄漏蜂桶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一也切、第九天 我趴在偏房一處隱蔽的房頂上張望屎飘。 院中可真熱鬧妥曲,春花似錦、人聲如沸钦购。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽押桃。三九已至,卻和暖如春导犹,著一層夾襖步出監(jiān)牢的瞬間唱凯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工谎痢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磕昼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓节猿,卻偏偏與公主長(zhǎng)得像票从,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滨嘱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,665評(píng)論 9 163
  • 奔跑第十五天 “春風(fēng)化雨暖透我的心峰鄙,一生眷顧無言的贈(zèng)送”,生活總是一成不變就顯得過于平淡太雨,哪怕是起起落落也是一種很...
    涵涵隨記閱讀 294評(píng)論 0 1
  • 晨登涂山尋禹跡吟榴,春入嶺巒已蔥籠。 寺鐘伴茗且得閑囊扳,但見大江從容去吩翻。
    苦茶及酒閱讀 439評(píng)論 0 0
  • 早上醒來狭瞎,習(xí)慣性的打開新聞,看看又發(fā)生了什么新鮮事她君。陳思城出軌了脚作,驚愕之余,太心疼丫丫缔刹,孩子才兩歲球涛,她將如何選擇,...
    陽陽小麥閱讀 333評(píng)論 3 1