一、基礎(chǔ)學(xué)習(xí)
1.1基本命令
//查詢基礎(chǔ)信息
git config --global --list
//選取合適位置創(chuàng)建
mkdir 文件名 //創(chuàng)建文件夾
//全局配置
git config --global user.email "****e@***i"
git config --global user.name "*** K****"
//--------------------進(jìn)入指定目錄后
//初始化倉庫
git init
或
//初始化名為...的倉庫
git init +倉庫名
或
//克隆遠(yuǎn)程倉庫
git clone +倉庫地址
//此時(shí)可能會(huì)顯示 目錄名 main 代表在main分支
ls -a //查看目錄文件
1.2工作區(qū)域和文件狀態(tài)
本地?cái)?shù)據(jù)管理:
-
工作區(qū)
:(Working Directory)電腦本地的目錄 -
暫存區(qū)
:(Staging Area)臨時(shí)存儲(chǔ)區(qū)域,保存即將push到倉的文件。 -
本地倉庫
:(Local Repository)包含完整的項(xiàng)目歷史和原始數(shù)據(jù),git存儲(chǔ)版本信息和代碼的主要位置。
文件狀態(tài):
- Untrack 未跟蹤
- Unmodifiled 未修改
- Modified 已修改
- Staged 已暫存
git status //查看倉庫狀態(tài) 文件狀態(tài)
git add +文件路徑 //將文件提交到暫存區(qū)
git rm --cached <file> //將文件移除暫存區(qū)
git commit -m +"描述的信息" //提交暫存區(qū)的文件
git log //查看提交記錄
或者
git log --oneline //簡潔信息
echo + 內(nèi)容 +文件名 //將內(nèi)容寫入文件
cat +文件名 //讀取文件
1.3修改操作
git reset --soft +版本id //回退版本,保留工作區(qū)和暫存區(qū)的內(nèi)容
git reset --hard +版本id //回退版本,不保留工作區(qū)和暫存區(qū)的內(nèi)容
git reset --mixed +版本id//回退版本,保留工作區(qū)但不保留暫存區(qū)的內(nèi)容(默認(rèn)參數(shù))
git reset --soft HEAD~1//回退到當(dāng)前分支的上一次提交
比如我們git log查看提交歷史
commit 7e4558c35e12a8f102d7215c5fce2462eb738bff (HEAD -> bias_draw, origin/bias_draw)
commit 9d5dceae74e5fa9a2e63e8f31520bde3993d5f0f (origin/carChange, carChange)
commit ab95103b9015c43242a364baa385b9565d40168a (master)
如果想回退可以
git reset --soft 7e4558c35e12a8f102d7215c5fce2462eb738bff
二、分支(Branch)
2.1 基本概念
可以視為代碼庫的不同版本。
- 可以從當(dāng)前的開發(fā)線中分割出一個(gè)新的開發(fā)線,從而在不影響原來開發(fā)線的過程中,開發(fā)并提交代碼,等到新的開發(fā)線開發(fā)完成,可以一次性加入原開發(fā)線,即進(jìn)行分支合并操作。
- 分支在實(shí)際中有什么用呢?假設(shè)你準(zhǔn)備開發(fā)一個(gè)新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由于代碼還沒寫完,不完整的代碼庫會(huì)導(dǎo)致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進(jìn)度的巨大風(fēng)險(xiǎn)。
- 現(xiàn)在有了分支,就不用怕了。你創(chuàng)建了一個(gè)屬于你自己的分支,別人看不到,還繼續(xù)在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發(fā)完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人工作。
適合團(tuán)隊(duì)協(xié)作和團(tuán)隊(duì)管理。每個(gè)開發(fā)人員在自己的分支上進(jìn)行開發(fā)。
查看分支可以下載一個(gè)名為Git Graph
的插件(VScode中的商店)。
2.2 使用
默認(rèn)git中只有一個(gè)主分支master,head就指向master
head
|
master
|
x----x----x
每次提交master分支都會(huì)向前移動(dòng)一步,這樣,隨著你不斷提交,master分支的線也越來越長
head
|
master
|
x----x----x----x
當(dāng)我們創(chuàng)建新的分支,例如dev時(shí),Git新建了一個(gè)指針叫dev,指向master相同的提交,
再把HEAD指向dev,就表示當(dāng)前分支在dev上:
創(chuàng)建分支:
$ git branch dev
$ git checkout dev
或
$ git checkout -b dev
-b參數(shù)表示創(chuàng)建并切換
用git branch命令查看當(dāng)前分支
$git branch
master
|
x----x----x----x
|
dev
|
head
Git創(chuàng)建一個(gè)分支很快,因?yàn)槌嗽黾右粋€(gè)dev指針,改改HEAD的指向,工作區(qū)的文件都沒有任何變化!
從現(xiàn)在開始,對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了,比如新提交一次后,dev指針往前移動(dòng)一步,
而master指針不變
創(chuàng)建文件:
test2.txt
creating a new branch is quick.
提交:
$ git add test2.txt
$ git commit -m "branch test"
master
|
x----x----x----x----x
|
dev
|
head
如我們?cè)赿ev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?
最簡單的方法,就是直接把master指向dev的當(dāng)前提交,就完成了合并:
切換回主分支
$git checkout master
head
|
master
|
x----x----x----x----x
|
dev
把dev分支的工作成果合并到master分支上。git merge命令用于合并指定分支到當(dāng)前分支。
此時(shí)采用的是快速合并策略。
$git merge dev
head
|
master
|
x----x----x----x----x
|
dev
?
? 合并完分支后,甚至可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,我們就剩下了一條master分支:
? 刪除dev分支:
? $ git branch -d dev
? 查看branch:
? $ git branch
?
head
|
master
|
x----x----x----x----x
2.3 合并沖突
當(dāng)多個(gè)分支之間的進(jìn)行合并時(shí),可能會(huì)產(chǎn)生沖突,需要對(duì)沖突解決后才能合并分支
創(chuàng)建新的分支feature1
$ git checkout -b feature1
修改文件:
test2.txt
creating a new branch is quick and simple.
在feature1分支上提交:
$ git add test2.txt
$ git commit -m "AND simple"
切換到master分支:
$ git checkout master
修改文件:
test2.txt
Creating a new branch is quick & simple.
在master分支上提交:
$ git add test2.txt
$ git commit -m "& simple"
這種情況下,Git無法執(zhí)行“快速合并”,只能試圖把各自的修改合并起來,但這種合并就可能會(huì)有沖突:
$ git merge feature1
Git告訴我們,test2.txt文件存在沖突,必須手動(dòng)解決沖突后再提交。git status也可以告訴我們沖突的文件:
$ git status
修改如下后保存:
Creating a new branch is quick and simple.
再提交:
$ git add test2.txt
$ git commit -m "conflict fixed"
用帶參數(shù)的git log也可以看到分支的合并情況:
$ git log --graph --pretty=oneline --abbrev-commit
最后,刪除feature1分支:
$ git branch -d feature1
沖突解決。
2.4 強(qiáng)制禁止快速合并策略
通常,合并分支時(shí),如果可能,Git會(huì)用Fast forward模式,但這種模式下,刪除分支后,會(huì)丟掉分支信息。
如果要強(qiáng)制禁用Fast forward模式,Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣,從分支歷史上就可以看出分支信息。
創(chuàng)建dev分支:
$ git checkout -b dev
修改文件:
test2.txt
creating a new branch is quick and simple xxx.
提交:
$ git add readme.txt
$ git commit -m "add merge"
切換回master:
$ git checkout master
強(qiáng)制禁止快速合并模式,合并分支:
$ git merge --no-ff -m "merge with no-ff" dev
2.5 多人協(xié)作
在多人使用遠(yuǎn)程倉庫進(jìn)行工作時(shí),往往在同一個(gè)分支上的操作會(huì)存在沖突,此時(shí)需要遠(yuǎn)程沖突合并。
多人協(xié)作的工作模式通常是這樣:
1.首先,可以試圖用git push origin 推送自己的修改;
2.如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新,需要先用git pull試圖合并;
3.如果合并有沖突,則解決沖突,并在本地提交;
4.沒有沖突或者解決掉沖突后,再用git push origin 推送就能成功!
5.如果git pull提示no tracking information,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream-to origin/
另外有一種情況,當(dāng)你已經(jīng)開發(fā)了一部分功能的時(shí)候。別的分支推送并合并了新功能。
可以通過說stash進(jìn)行文件暫存再拉取。
git stash //將文件添加到暫存區(qū)
緊接著
git pull origin 分支名 //拉遠(yuǎn)程倉庫到本地
git stash pop //取出暫存文件
三、遠(yuǎn)程倉庫
3.1 新建遠(yuǎn)程倉庫
使用GitHub、碼云、GitLab等,碼云相當(dāng)于國內(nèi)的GitHub,在國內(nèi)訪問速度高于GitHub
3.2關(guān)聯(lián)遠(yuǎn)程倉庫
3.2.1git全局配置
git config --global user.name "**** ****"
git config --global user.email *******@*****"
3.2.2 三種情況
a 本地?zé)o倉庫
創(chuàng)建
一個(gè)文件夾中初始化
一個(gè)本地倉庫
mkdir gitee_essay 創(chuàng)建一個(gè)名為gitee_essay的文件夾
cd gitee_essay
git init 初始化倉庫
touch README.md
如果 filename 指定的文件已經(jīng)存在,touch 會(huì)更新該文件的最后訪問時(shí)間和最后修改時(shí)間為當(dāng)前系統(tǒng)時(shí)間。
如果 filename 指定的文件不存在,touch 將會(huì)創(chuàng)建一個(gè)名為 filename 的新的空文件。
git add touch README.md 添加到暫存區(qū)
git commit -m 'first commit' 提交
git remote add 連接名 遠(yuǎn)程倉庫鏈接 添加遠(yuǎn)程倉庫連接,關(guān)聯(lián)本地倉庫
--------------------------------------------------------------------------------
git remote add origin https://devops.momenta.works/Momenta/apa_simulator/_git/apa-simulator-web-app
---------------------------------------------------------------------------------
git push -u origin "master" push到遠(yuǎn)程倉庫
1、把當(dāng)前分支的提交推送到名為 origin 的遠(yuǎn)程倉庫上。
2、"master" 是要推送的本地分支的名稱。
3、使用 -u 設(shè)置追蹤信息,為未來的 pull 和 push 命令配置默認(rèn)的遠(yuǎn)程分支,即把本地的 "master" 分支與遠(yuǎn)程的 "master" 分支關(guān)聯(lián)起來。
在 Git 命令 git push -u origin "master"
中,-u
和 origin
代表以下含義:
-
-u
是--set-upstream
的簡寫。這個(gè)選項(xiàng)的作用是將本地分支與遠(yuǎn)程分支關(guān)聯(lián)起來,以便于將來的git pull
或git push
操作可以省略分支參數(shù)。使用-u
參數(shù)后,Git 將記錄下你推送時(shí)指定的遠(yuǎn)程倉庫和分支,以后你只需要運(yùn)行git push
或git pull
即可自動(dòng)同步當(dāng)前分支。 -
origin
是遠(yuǎn)程倉庫的默認(rèn)名稱。當(dāng)你克隆一個(gè)倉庫時(shí),Git 自動(dòng)為其創(chuàng)建一個(gè)名為origin
的遠(yuǎn)程引用,指向你克隆的倉庫。它是遠(yuǎn)程倉庫的別名,在大多數(shù)情況下,origin
代表了項(xiàng)目主倉庫的位置。
b本地已有倉庫
cs 倉庫文件夾
git remote add 連接名 遠(yuǎn)程倉庫鏈接 添加遠(yuǎn)程倉庫連接,關(guān)聯(lián)本地倉庫
--------------------------------------------------------------------------------
git remote add origin https://devops.momenta.works/Momenta/apa_simulator/_git/apa-simulator-web-app
---------------------------------------------------------------------------------
git push -u origin "master" push到遠(yuǎn)程倉庫
c、 clone遠(yuǎn)程倉庫
git clone 遠(yuǎn)程倉庫鏈接
推薦薦使用此方式,簡潔優(yōu)雅
例如:
git clone https://github.com/user/repo.git
這個(gè)命令會(huì)完成以下操作:
- 在當(dāng)前目錄下創(chuàng)建一個(gè)名為
repo
的文件夾。 - 初始化一個(gè)新的 Git 倉庫在這個(gè)
repo
文件夾內(nèi)。 - 添加遠(yuǎn)程倉庫引用到新的 Git 倉庫配置里,默認(rèn)遠(yuǎn)程倉庫名稱是
origin
。 - 拉取遠(yuǎn)程倉庫
origin
的所有數(shù)據(jù)(包括所有分支和標(biāo)簽)。 - 根據(jù)遠(yuǎn)程倉庫的默認(rèn)分支(通常是
master
或main
),檢出該分支的一個(gè)副本到新倉庫的工作目錄。
因此,在你完成 git clone
后,不需要再手動(dòng)添加遠(yuǎn)程倉庫鏈接;它已經(jīng)被配置好了,并且可以直接使用 git push
和 git pull
來與克隆源進(jìn)行同步。如果你想要查看已配置的遠(yuǎn)程倉庫信息,可以使用以下命令:
git remote -v
這個(gè)命令會(huì)列出所有遠(yuǎn)程倉庫的 URL,包括用于 fetch
(拉?。┖?push
(推送)的 URL。
3.2.3 遠(yuǎn)程倉庫操作
查看遠(yuǎn)程倉庫連接
git remote -v
添加遠(yuǎn)程倉庫鏈接
git remote add 連接名 遠(yuǎn)程倉庫鏈接
拉取文件到本地
在進(jìn)行拉取之前要先提交本地倉庫,達(dá)到“working tree clear”狀態(tài)
檢查本地倉庫的狀態(tài),拉取前先保證本地倉庫為“完美狀態(tài)”(working tree clean)
git status //查看倉庫狀態(tài) 文件狀態(tài)
git pull 連接名 遠(yuǎn)程倉庫分支名
比如
git pull origin master 從遠(yuǎn)程倉庫origin 拉到本地分支master
推送文件至遠(yuǎn)程倉庫
git push 連接名 遠(yuǎn)程倉庫分支名
git push origin dev
在進(jìn)行推送之前要先進(jìn)行拉取,保證自己本地倉庫的內(nèi)容是最新的
在本地倉庫新建一個(gè)文件,或者更新了文件
先拉取
git pull 連接名 遠(yuǎn)程倉庫分支名
git pull origin dev 從遠(yuǎn)程倉庫origin 拉取到遠(yuǎn)程倉庫分支,再同步到本地分支dev
再提交
git add 文件名
git commit -m "描述信息"
再推送
git push 連接名 遠(yuǎn)程倉庫分支名
git push origin dev
使用 git branch 命令創(chuàng)建一個(gè)新的分支,例如名稱為 feature-branch:
git branch feature-branch
git branch //可以查詢分支
之后,您可以使用 git checkout 命令切換到您剛剛創(chuàng)建的新分支:
git checkout feature-branch
或者,您可以用單行命令結(jié)合創(chuàng)建和切換分支的步驟:
git checkout -b feature-branch
這個(gè) -b 參數(shù)告訴 Git 如果分支不存在就創(chuàng)建它,并且切換到該分支。
從 Git 版本 2.23 開始,您也可以使用 git switch 命令來切換分支:
要切換到現(xiàn)有分支:
sh
git switch existing-branch
要?jiǎng)?chuàng)建并切換到新分支:
sh
git switch -c feature-branch
git branch -d 分支名
- 在切換分支之前,確保所有更改都已提交或暫存,否則未提交的變更可能會(huì)隨您切換到新分支。
- 使用 git status 來檢查您的工作目錄狀態(tài)。
- 使用 git branch 查看所有分支并確認(rèn)當(dāng)前所在分支。
3.2.4推送沖突
當(dāng)多個(gè)人操作遠(yuǎn)端倉庫,對(duì)同一文件操作,內(nèi)容不一致時(shí)會(huì)在推送時(shí)發(fā)生沖突。
例如,有A、B兩個(gè)本地倉庫,都鏈接到了同一個(gè)遠(yuǎn)程倉庫,并對(duì)master分支下的Gitee.txt文件操作
A先提交并推送(沒有問題)
B在提交推送前的拉取時(shí),出現(xiàn)修改沖突(fix conflicts……)
查看B中的Gitee.txt文件,箭頭符號(hào)包含的部分是沖突的內(nèi)容
四、分支操作–公司協(xié)作
新創(chuàng)建的倉庫,默認(rèn)會(huì)有一個(gè)master分支,一般不會(huì)在master分支上添加版本,而是會(huì)建立一套分支系統(tǒng),在各自的分支上推送內(nèi)容,稱為工作流。
4.1基本操作
創(chuàng)建分支
git branch 分支名
查看分支
git branch
創(chuàng)建newline分支并查看,分支名前面帶“*”,表示當(dāng)前所處分支
切換分支
建議在切換分支之前,先提交本分支的內(nèi)容到本地,以免造成混亂,不知道什么分支的內(nèi)容沒有提交。另外,從master分支切換到其他分支,其他分支會(huì)復(fù)制一份master分支的內(nèi)容到本分支。
git checkout 分支名
已切換到newline分支,但是本地倉庫文件未發(fā)生變化,是因?yàn)樵摲种?fù)制了一份master分支的內(nèi)容
4.2 更新文件
在newline分支新建一個(gè)文件,并提交至版本庫,然后切換回master分支
master分支并沒有newline分支的文件

4.3推送到遠(yuǎn)程倉庫
同樣,推送分支前先檢查本地倉庫該分支下的狀態(tài)是否為“完美狀態(tài)”
git push 遠(yuǎn)程倉庫鏈接名 分支名
推送newline分支至遠(yuǎn)程倉庫
可以看到遠(yuǎn)程倉庫已有newline分支
4.4合并分支
在合并分支之前,先檢查本地各分支的狀態(tài)是否為“完美狀態(tài)”
git merge 分支名
現(xiàn)在在本地倉庫下,有三個(gè)分支,分別是master、moreline、newline,每個(gè)分支下分別自己獨(dú)有的文件
三個(gè)分支,都達(dá)到“完美狀態(tài)”
合并newline分支和moreline分支。需要注意的是,合并分支前要先切換到newline分支下,即合并A、B分支,要先切換到A分支
合并分支后,newline分支有兩個(gè)分支合并后的內(nèi)容
合并分支后,將合并后的分支newline,推送到遠(yuǎn)端,當(dāng)然推送前需先拉取
另外,合并分支后,被合并的分支并不會(huì)消失。切換到該分支,還能看到該分支下的獨(dú)有內(nèi)容,如果在該分支下創(chuàng)建文件并推送到遠(yuǎn)端。之前雖然合并過分支,但并不會(huì)同步地增加被合并分支新增的文件內(nèi)容。如有需要,還需再次合并。
總結(jié)
(1)可以設(shè)置SSH公鑰的方式連接遠(yuǎn)程倉庫,更安全方便;
(2)使用Git命令窗口操作,雖然簡潔高效,但非常容易操作失誤(如文件未加入暫存區(qū)、未提交至版本庫、分支未提交等等),可以使用tortoisegit,是一款專門為Git提供可視化操作的工具(官網(wǎng):https://download.tortoisegit.org/tgit/)
五、Merge和rebase(待更新)
merge(合并)
rebase
rebase
rebase和merge區(qū)別文章來源:http://www.zghlxwxcb.cn/news/detail-860484.html
六、提交完畢以后創(chuàng)建PR(Pull Request)
1、推送您的本地分支到遠(yuǎn)程倉庫(如果還沒有推送的話),如下所示:
git push origin your-branch-name
2、訪問遠(yuǎn)程倉庫的網(wǎng)頁,例如 https://github.com/user/repo。
3、您通常會(huì)在倉庫的首頁看到一個(gè)按鈕提示您創(chuàng)建 Pull Request。如果您剛剛推送了一個(gè)新分支,GitHub 會(huì)自動(dòng)檢測到這一點(diǎn),并可能提供一個(gè)快速創(chuàng)建 PR 的選項(xiàng)。
4、如果沒有自動(dòng)提示,您可以轉(zhuǎn)到 "Pull requests" 標(biāo)簽頁,并點(diǎn)擊 "New pull request" 按鈕。
5、在創(chuàng)建 PR 的頁面上,選擇正確的基礎(chǔ)分支(base branch,即您希望代碼被合并進(jìn)去的目標(biāo)分支),以及要合并的主題分支(compare branch,即您的工作分支)。
6、填寫 Pull Request 的標(biāo)題和描述,清晰地說明您的更改內(nèi)容以及為何進(jìn)行這些更改。
7、確認(rèn)無誤后,點(diǎn)擊 "Create pull request" 按鈕提交您的請(qǐng)求。
提交 Pull Request 后,項(xiàng)目維護(hù)者或其他貢獻(xiàn)者會(huì)審查代碼,并可能提出修改建議。根據(jù)反饋,您可能需要更新您的分支以解決問題或作進(jìn)一步的更改。一旦審查通過,Pull Request 就可以被合并到目標(biāo)分支中。
如果提交pr,leader說代碼仍然需要修改。
重復(fù)操作 提交一個(gè)新創(chuàng)建的文件
文章來源地址http://www.zghlxwxcb.cn/news/detail-860484.html
到了這里,關(guān)于Git--基礎(chǔ)學(xué)習(xí)--面向企業(yè)--持續(xù)更新的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!