溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Git工程開發(fā)實(shí)踐(三)——Git常用操作

發(fā)布時(shí)間:2020-09-24 13:30:47 來源:網(wǎng)絡(luò) 閱讀:2740 作者:天山老妖S 欄目:軟件技術(shù)

Git工程開發(fā)實(shí)踐(三)——Git常用操作

一、Git倉庫操作

1、Git倉庫創(chuàng)建

git init
在當(dāng)前目錄中初始化Git倉庫
git init [project-name]
創(chuàng)建一個(gè)新目錄并初始化倉庫
初始化git倉庫會(huì)默認(rèn)創(chuàng)建一個(gè)mater分支,創(chuàng)建名為.git的子目錄,內(nèi)含初始化Git倉庫中所有的骨干文件,此時(shí)倉庫中的文件還沒有被跟蹤。
通過git add命令來實(shí)現(xiàn)對(duì)指定文件的跟蹤,然后執(zhí)行g(shù)it commit提交。

git add .
git commit -m 'initial project version'

.git倉庫目錄如下:
A、HEAD:當(dāng)前處于哪個(gè)分支
B、config:項(xiàng)目的配置信息
C、description:項(xiàng)目描述信息
D、index:索引文件(暫存區(qū))
E、hooks/:系統(tǒng)默認(rèn)鉤子腳本目錄
F、logs/:各個(gè)refs的歷史信息
G、objects/:git倉庫的所有對(duì)象(commit,tree,blog,tag)
H、refs/:標(biāo)識(shí)目錄中每一個(gè)分支指向哪個(gè)commit

2、Git倉庫克隆

Git克隆倉庫的命令格式: git clone [url]
當(dāng)執(zhí)行g(shù)it clone命令的時(shí)候,默認(rèn)配置下遠(yuǎn)程Git倉庫中的每一個(gè)文件的每一個(gè)版本都將被拉取下來。所有本地分支默認(rèn)與遠(yuǎn)程主機(jī)的同名分支,并建立追蹤關(guān)系。
克隆Git的可鏈接庫libgit2的命令如下:
git clone https://github.com/libgit2/libgit2
在當(dāng)前目錄下創(chuàng)建一個(gè)名為libgit2的目錄,并在目錄下初始化一個(gè).git目錄,從遠(yuǎn)程倉庫拉取下所有數(shù)據(jù)放入.git目錄,然后從中讀取最新版本的文件的拷貝。
如果指定本地創(chuàng)建的倉庫名字變?yōu)閘ibgit,可以使用:
git clone https://github.com/libgit2/libgit2 libgit
git clone是一個(gè)封裝了其它命令的命令,執(zhí)行g(shù)it clone命令會(huì)執(zhí)行以下操作:創(chuàng)建一個(gè)新目錄,切換到新的目錄,然后git init來初始化一個(gè)空的Git倉庫,然后為指定的URL添加一個(gè)(默認(rèn)名稱為origin)遠(yuǎn)程倉庫(git remote add),再針對(duì)遠(yuǎn)程倉庫執(zhí)行g(shù)it fetch,最后通過git checkout將遠(yuǎn)程倉庫的最新提交檢出到本地的工作目錄。
git clone支持四種協(xié)議,HTTP(S)、SSH、Git、本地文件協(xié)議。
git clone -o newname [url]
從url克隆倉庫時(shí)指定創(chuàng)建目錄為newname
二、Git文件操作
1、Git文件狀態(tài)
Git工程開發(fā)實(shí)踐(三)——Git常用操作
Untracked: 未跟蹤,文件在工作目錄中,但沒有加入到倉庫,不參與版本控制。通過git add將狀態(tài)變?yōu)镾taged。
Unmodified: 文件已經(jīng)加入版本庫,未修改,即版本庫中的文件快照內(nèi)容與工作目錄中完全一致。如果被修改,變?yōu)镸odified;如果使用git rm移出版本庫,則成為Untracked。
Modified: 文件被修改,并沒有進(jìn)行其它操作。通過git add可進(jìn)入暫存staged狀態(tài),使用git checkout則丟棄修改,返回到unmodified狀態(tài)。git checkout即從版本庫中取出文件,覆蓋當(dāng)前修改。
Staged: 暫存狀態(tài)。執(zhí)行g(shù)it commit則將修改同步到版本庫中,此時(shí)版本庫中的文件和本地文件一致,文件為Unmodified狀態(tài)。執(zhí)行g(shù)it reset HEAD filename取消暫存,文件狀態(tài)為Modified。
文件狀態(tài)的查看可以使用如下命令:
git status [filename]
查看指定文件狀態(tài)
git status
查看所有文件狀態(tài)

2、Git添加文件與目錄

git add將工作目錄的變化添加到暫存區(qū),以備下次提交。
git add [file1] [file2] ...
添加指定文件到暫存區(qū)
git add [dir]
添加指定目錄到暫存區(qū),包括子目錄

git add .  添加新文件和被修改文件到暫存區(qū),但不包括被刪除文件
git add -u  提交被修改和被刪除文件到暫存區(qū),不包括新文件
git add -A 添加工作目錄的所有變化到暫存區(qū)

3、Git刪除文件與目錄

git rm --cached <file>
直接從暫存區(qū)刪除文件,工作區(qū)則不做改變
git reset HEAD <file>...
如果已經(jīng)用add把文件加入暫存區(qū),先需要從暫存區(qū)中撤銷;
當(dāng)執(zhí)行g(shù)it reset HEAD命令時(shí),暫存區(qū)的目錄樹會(huì)被重寫,被當(dāng)前分支指向的目錄樹所替換,但工作區(qū)不受影響。
git clean [options]
移除所有未跟蹤文件,-d表示包含目錄,-f表示強(qiáng)制清除。
git rm filename
刪除暫存區(qū)、工作目錄中的文件

4、Git文件差異查看

git diff用于查看工作目錄中的文件和暫存區(qū)文件的差異
git diff [files]
當(dāng)暫存區(qū)中沒有文件時(shí),比較工作區(qū)中的文件與上次提交到版本庫中文件的差異;當(dāng)暫存區(qū)中有文件時(shí),比較當(dāng)前工作區(qū)中文件與暫存區(qū)中文件的差異。
git diff --cached
比較暫存區(qū)的文件與已經(jīng)提交過的文件
git diff HEAD~n
比較某個(gè)歷史版本與工作目錄中的文件差異

5、Git檢出

git checkout用于Git版本庫檢出,會(huì)重寫工作目錄,是危險(xiǎn)的命令。
git checkout branch
檢出branch分支。將HEAD指向branch分支,用branch 的當(dāng)前目錄樹更新暫存區(qū)和工作目錄。

git checkout
git checkout HEAD

顯示工作目錄、暫存區(qū)與HEAD的差異。
git checkout -- filename
用暫存區(qū)中filename文件來覆蓋工作目錄中的filename文件。
git checkout .
用暫存區(qū)全部文件覆蓋工作目錄的全部文件
git checkout -- filename
用暫存區(qū)的指定文件覆蓋工作目錄的指定文件
git checkout HEAD .
用HEAD指向分支中的全部文件覆蓋暫存區(qū)和工作目錄中的文件

git checkout HEAD <file>

用HEAD指向分支中的指定文件覆蓋暫存區(qū)和工作目錄中的文件
git checkout branch -- filename
維持HEAD的指向不變,用branch所指向提交中filename文件覆蓋暫存區(qū)和工作區(qū)中相應(yīng)的文件。
git checkout commit_id -- file_name
維持HEAD的指向不變,用commit_id,所指向提交中filename文件覆蓋暫存區(qū)和工作區(qū)中相應(yīng)的文件。

6、Git提交

當(dāng)git commit命令執(zhí)行時(shí),將暫存區(qū)的所有文件內(nèi)容在版本庫中創(chuàng)建一個(gè)持久的快照,然后將當(dāng)前分支上的HEAD指針移到新創(chuàng)建的快照上。每一次提交會(huì)生成一個(gè)commit對(duì)象,每一個(gè)commit對(duì)象指向一個(gè)tree對(duì)象,每個(gè)tree對(duì)象指向一個(gè)文件夾或文件。
git commit -m [message]
提交暫存區(qū)到本地倉庫
git commit [file1] [file2] ... -m [message]
提交暫存區(qū)的指定文件到本地倉庫
git commit -a
提交工作區(qū)的變化直接到本地倉庫,對(duì)新文件無效
git commit -v
提交時(shí)顯示所有diff信息
git commit --amend -m [message]
修訂提交,使用一次新的commit,替代上一次提交。如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息
git commit --amend [file1] [file2] ...
重做上一次commit,并包括指定文件的新變化
git revert commit-id
撤回指定版本的內(nèi)容并提交一個(gè)新的commit,不影響之前提交的內(nèi)容

7、Git日志查看

查看提交日志可以使用git log
git log --graph
以圖形化的方式顯示提交歷史的關(guān)系
git reflog
記錄倉庫中所有的分支的所有更新記錄,包括已經(jīng)撤銷的更新。
git log --pretty=oneline
單行顯示所有提交日志信息
git log -n
打印最近n次的提交日志信息

8、Git文件查看

git ls-files用于查看指定狀態(tài)的文件列表
git ls-files
默認(rèn)查看所有緩存的文件
git ls-files -o
查看未被跟蹤的文件
git ls-files --modified
查看被修改的文件
git ls-files -s
查看暫存區(qū)中文件詳細(xì)

9、Git壓棧儲(chǔ)藏

在實(shí)際工程開發(fā)中,可能需要緊急修復(fù)某個(gè)bug,但當(dāng)前工作目錄中工作可能沒有完成,需要臨時(shí)保存,以便清理工作目錄,切換到其它分支進(jìn)行修復(fù)。此時(shí),可以使用壓棧儲(chǔ)藏功能。
git stash
將工作區(qū)的所有文件壓棧到儲(chǔ)藏區(qū)
git stash --list
查看壓棧儲(chǔ)藏區(qū)的所有stash列表
git stash pop [stash_id]
從儲(chǔ)藏棧彈出棧頂?shù)臄?shù)據(jù),恢復(fù)到工作目錄,,可以指定stash_id
git stash drop [stash_id]
將儲(chǔ)藏棧棧頂?shù)臄?shù)據(jù)彈出拋棄,可以指定stash_id
git stash apply [--index] [stash_id]
如果執(zhí)行g(shù)it stash時(shí)工作區(qū)的狀態(tài)是部分文件已經(jīng)加入暫存區(qū),部分文件沒有,當(dāng)執(zhí)行g(shù)it stash apply后會(huì)發(fā)現(xiàn)所有文件都變成未暫存的,如果想維持原來暫存的文件仍然是暫存狀態(tài),可以加上--index參數(shù)。可以指定stash_id。
git stash clear
刪除儲(chǔ)藏棧中所有的數(shù)據(jù)

10、Git撤銷更新

git reset [options] commit_id
git reset命令主要用來根據(jù)傳遞給動(dòng)作的參數(shù)來執(zhí)行撤銷操作。 git reset會(huì)使HEAD指向指定的commit_id,一般會(huì)用到3個(gè)參數(shù),參數(shù)會(huì)影響到工作區(qū)與暫存區(qū)中的修改:
--soft: 只改變HEAD的State,不更改工作區(qū)與暫存區(qū)的內(nèi)容
--mixed(默認(rèn)): 撤銷暫存區(qū)的修改,暫存區(qū)的修改會(huì)轉(zhuǎn)移到工作區(qū)
--hard: 撤銷工作區(qū)與暫存區(qū)的修改

11、Git文件刪除

git rm -f filename
刪除暫存區(qū)、工作目錄中的fiename文件
git rm --cached filename
刪除暫存區(qū)中的filename文件,工作目錄中不做修改
對(duì)于未跟蹤狀態(tài)的文件,直接刪除文件即可

三、Git分支操作

1、Git分支查看

git branch
列出所有本地分支
git branch -r
列出所有遠(yuǎn)程分支
git branch -a
列出所有本地分支和遠(yuǎn)程分支

2、Git分支創(chuàng)建

git branch [branch-name]
新建一個(gè)branch-name分支,但停留在當(dāng)前分支
git checkout -b [branch]
新建一個(gè)branch分支并切換到該分支
git branch [branch] [commit_id]
新建一個(gè)分支,指向指定commit_id提交
git branch --track [branch] [remote-branch]
新建一個(gè)分支,并與遠(yuǎn)程分支建立追蹤關(guān)系

3、Git分支切換

git checkout [branch-name]
切換到指定分支,并更新工作目錄
git checkout -
切換到上一個(gè)分支
git branch --set-upstream [branch] [remote-branch]
在現(xiàn)有指定分支與指定的遠(yuǎn)程分支之間建立追蹤關(guān)系

4、Git分支合并

git merge用來合并一個(gè)或者多個(gè)分支到當(dāng)前分支中,然后將HEAD指針移動(dòng)到合并結(jié)果的提交快照上。
git merge branchname
將branchname分支合并到當(dāng)前分支
git merge [remote/branch]
合并獲取的遠(yuǎn)程分支到當(dāng)前分支
git merge –ff branch
使用快進(jìn)式(fast-forward)合并分支,不會(huì)產(chǎn)生新的合并提交快照,是默認(rèn)合并方式。
git merge –no-ff branch
使用非快進(jìn)式合并,會(huì)創(chuàng)建一個(gè)新的合并提交快照
fast-forward:
Git工程開發(fā)實(shí)踐(三)——Git常用操作
no-fast-forwar:
Git工程開發(fā)實(shí)踐(三)——Git常用操作
git cherry-pick [commit]
選擇一個(gè)commit,合并進(jìn)當(dāng)前分支

5、Git變基(衍合)

Git工程開發(fā)實(shí)踐(三)——Git常用操作
當(dāng)前分支再mywork,當(dāng)使用git merge將origin分支合并到mywork分支上時(shí),Git創(chuàng)建一個(gè)新的提交C7。
Git工程開發(fā)實(shí)踐(三)——Git常用操作
如果使用git rebase將origin分支rebase到mywork分支時(shí),Git會(huì)將當(dāng)前分支mywork分支自分叉提交點(diǎn)(C2)后面的每個(gè)提交(commit)拷貝到origin分支后面,并將HEAD指針指向最新的提交點(diǎn)。
Git工程開發(fā)實(shí)踐(三)——Git常用操作
git rebase [startpoint] [endpoint]
將從startpoint到endpoint的多次提×××并為一次提交。
git rebase -i HEAD~3
將最后三次提×××并為一次提交
Git工程開發(fā)實(shí)踐(三)——Git常用操作
git rebase [startpoint] [endpoint] --onto [branchName]
將[startpoint]到[endpoint]開閉區(qū)間內(nèi)的提交復(fù)制到[branchName]分支上
此時(shí),當(dāng)前HEAD處于游離狀態(tài),Git只是將C~E部分的提交內(nèi)容復(fù)制一份粘貼到master所指向的提交后面,需要將master所指向的提交id設(shè)置為當(dāng)前HEAD所指向的提交。
git reset --hard commit_id
merge不會(huì)修改提交歷史,rebase會(huì)修改提交歷史。?rebase只應(yīng)用于本地沒有提交的代碼,不能用于遠(yuǎn)程分支,get merge可以應(yīng)用于遠(yuǎn)程分支。

6、Git分支刪除

git branch -d [branch-name]
刪除本地分支,-D(大寫)強(qiáng)制刪除

git push [remote] --delete [branch-name]
git push [remote] :remote-branch
git branch -dr [remote/branch]

刪除遠(yuǎn)程分支

四、Git遠(yuǎn)程倉庫操作

git fetch [remote-name] [branch]
獲取倉庫中指定分支的更新,但不自動(dòng)合并當(dāng)前分支
git fetch [remote-name]
獲取倉庫所有更新,但不自動(dòng)合并當(dāng)前分支
git pull [remote] [remote-branch]:[local-branch]
取回遠(yuǎn)程主機(jī)某個(gè)分支的更新,再與本地的指定分支合并
git pull
獲取當(dāng)前分支的唯一遠(yuǎn)程追蹤分支,并自動(dòng)合并到當(dāng)前分支
git pull [remote] [branch]
取回遠(yuǎn)程倉庫的branch分支,并與本地當(dāng)前分支合并
git pull [remote]
獲取當(dāng)前分支的遠(yuǎn)程倉庫追蹤分支,并與本地當(dāng)前分支合并
git pull -p
如果遠(yuǎn)程主機(jī)刪除了某個(gè)分支,默認(rèn)情況下,git pull不會(huì)在拉取遠(yuǎn)程分支的時(shí)候,刪除對(duì)應(yīng)的本地分支。使用參數(shù)-p可以在本地刪除遠(yuǎn)程已經(jīng)刪除的分支。
git remote -v
顯示所有遠(yuǎn)程倉庫
git remote show [remote]
顯示某個(gè)遠(yuǎn)程倉庫的信息
git remote add [shortname] [url]
增加一個(gè)新的遠(yuǎn)程倉庫,并命名
git remote
簡單查看遠(yuǎn)程所有倉庫(只能查看遠(yuǎn)程倉庫的名字)
git remote show [remote-branch-name]
查看單個(gè)倉庫
git remote add [branchname] [url]
新建遠(yuǎn)程倉庫
git remote rename [oldname] [newname]
修改遠(yuǎn)程倉庫
git remote rm [remote-name]
刪除遠(yuǎn)程倉庫

git push [remote] [local-branch]:[remote-branch]
git push [remote] [local-branch]

上傳本地指定分支到遠(yuǎn)程倉庫的追蹤分支,如果遠(yuǎn)程分支不存在,則會(huì)被新建。
git push [remote] --force
強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉庫,即使有沖突
git push [remote] --all
推送所有分支到遠(yuǎn)程倉庫
git push [remote] :[remote-branch]
刪除遠(yuǎn)程倉庫的指定遠(yuǎn)程分支,等同于:
git push [remote] --delete [remote-branch]

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI