贛州曬房網(wǎng)百度seo排名360
文章目錄
- Git 介紹
- GIt歷史
- Git 安裝
- 環(huán)境配置
- 工作區(qū)、緩存區(qū)和倉庫區(qū)(版本庫)
- 工作區(qū)(工作目錄)
- 暫存區(qū)
- 倉庫區(qū)
- git工作目錄下文件的裝填
- Git 生成公鑰及添加到gitlab或Gerrit上
- Git常用命令
- git stauts
- git statu -s
- git add
- git commit
- git reset
- 1. git reset --hard
- 2. git reset HEAD
- 3. `git reset --hard`
- git reflog
- git log
- git checkout
- git diff
- git stash
- git rebase
- git branch
- git clean
- git remote
- git fetch
- git pull
- git push
- git push <遠(yuǎn)程主機(jī)名> <本地分支名> : <遠(yuǎn)程分支名>
- git blame
- git 常用舉例
- git log輸出格式
- 查看一個(gè)文件提交的提交記錄
- 查看一個(gè)文件的提交記錄
- 查看單個(gè)文件提交記錄及內(nèi)容
- 查看某次提交中的某個(gè)文件變化
- 顯示每次提交的diff
- 其他問題
- 分支管理
- 合并模式
- 合并沖突
- git 打補(bǔ)丁
- 注意事項(xiàng)
- 參考鏈接:
Git 介紹
GIt歷史
Git 安裝
環(huán)境配置
-
git config --list 查看信息
-
git config --global user.name “your name” // 設(shè)置username
git config --global user.name "yourname"
-
git config --global user.email “your_email@youremail.com” // 設(shè)置郵箱
-
git config user.name 查看username
工作區(qū)、緩存區(qū)和倉庫區(qū)(版本庫)
工作區(qū)(工作目錄)
就是你在電腦里能看到的目錄。 對(duì)于添加、修改、刪除文件的操作,都發(fā)生在工作區(qū)中。包含.git文件夾的目錄就是工作目錄,主要用于存放開發(fā)的代碼
暫存區(qū)
暫存區(qū)指將工作區(qū)中的操作完成小階段的存儲(chǔ),是版本庫的一部分
倉庫區(qū)
工作區(qū)有一個(gè)隱藏目錄.git
,這個(gè)不是工作區(qū),而是git的版本庫,版本庫中存儲(chǔ)了很多配置信息、日志信息和文件版本信息等,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),倉庫區(qū)中記錄的各版本是可以查看并回退的,但是在暫存區(qū)的版本一旦提交就再也沒有了。
因?yàn)槲覀儎?chuàng)建git版本庫時(shí),git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支,所以,現(xiàn)在,git commit就是往master分支上提交更改。
你可以簡(jiǎn)單理解為,需要提交的文件修改通通放到暫存區(qū)【計(jì)算機(jī)的緩存區(qū)】,然后,一次性提交暫存區(qū)的所有修改,創(chuàng)建一個(gè)版本,放到master分支中。HEAD永遠(yuǎn)指向Master分支中的最新版本的。
git工作目錄下文件的裝填
Git工作目錄下的文件存在兩種狀態(tài):
- untracked 未跟蹤(未被納入版本控制)
比如說新建了個(gè)文件,沒有g(shù)it add。 - tracked 已跟蹤的三種狀態(tài)(被納入版本控制)
- Unmodified 未修改狀態(tài)
- Modified 已修改狀態(tài)
- Staged 已暫存狀態(tài)
Git 生成公鑰及添加到gitlab或Gerrit上
通過SSH拉取代碼時(shí),實(shí)際上是通過公鑰的驗(yàn)證機(jī)制來實(shí)現(xiàn)身份認(rèn)證。具體過程如下:
1. 在本地電腦上,使用命令ssh-keygen生成一對(duì)公鑰和私鑰,將公鑰保存在本地電腦的一個(gè)文件中(例如~/.ssh/id_rsa.pub)。
2. 將公鑰(即上一步生成的文件中的內(nèi)容)復(fù)制到服務(wù)器上。
3. 當(dāng)你使用SSH協(xié)議從本地電腦連接到服務(wù)器并進(jìn)行代碼拉取或推送時(shí),Git會(huì)自動(dòng)查找本地電腦上的私鑰,然后使用該私鑰對(duì)身份進(jìn)行驗(yàn)證,以確認(rèn)是本地電腦所有者訪問服務(wù)器。
4. 如果公鑰與私鑰匹配,服務(wù)器將接受身份驗(yàn)證并允許你訪問代碼庫。
總之,通過SSH拉取代碼時(shí),需要確保本地電腦上的公鑰已經(jīng)添加到服務(wù)器中,以便在進(jìn)行身份驗(yàn)證時(shí)可以讓服務(wù)器確認(rèn)你的身份。
- 進(jìn)入ssh目錄
cd ~/.ssh
- 查看是否生成公鑰
ls
2.1 若存在,則目錄下會(huì)有后綴為.pub的文件,如果不存在就自己生成公鑰
2.2 如果不存在,生成公鑰
??先通過git config --list
查看自己的郵箱
??再通過ssh-keygen -t rsa -C
"你的郵箱"命令生成公鑰 - 查看公鑰
cat id_rsa.pub
- 復(fù)制公鑰分別添加到gitlab和Gerrit上
git lab添加公鑰如下:
gerrit添加和gitlab步驟一樣。
Git常用命令
git stauts
查看文件狀態(tài)
git statu -s
輸出更簡(jiǎn)潔的文件狀態(tài)。
git add
git add 命令可將該文件添加到暫存區(qū)。
-
git add 【file】【file2】…
添加一個(gè)或多個(gè)文件到暫存區(qū)
-
git add 【dir】
添加指定目錄到暫存區(qū),包括子目錄
-
git add .
添加當(dāng)前目錄下的所有文件到暫存區(qū)
-
git add -A (git add --all 的簡(jiǎn)寫形式)
它會(huì)將當(dāng)前整個(gè)工作區(qū)中所有的文件改動(dòng)提交至?xí)捍鎱^(qū),包括新增、修改和被刪除的文件,不受當(dāng)前所在目錄限制。
-
git add *.c
提交以.c結(jié)尾的文件。
git commit
git commit 命令一次性將暫存區(qū)所有內(nèi)容添加到本地倉庫中,并創(chuàng)建一個(gè)版本。
-
git commit -m [message]
提交暫存區(qū)到本地倉庫中。 [message] 是備注消息
-
git commit [file1] [file2] … -m [message]
提交暫存區(qū)的指定文件到倉庫區(qū)。
-
git commit -a 或者 git commit -am [message]
如果你覺得 git add 提交緩存的流程太過繁瑣,Git 也允許你用 -a 選項(xiàng)跳過這一步,直接來提交。-a命令針對(duì)是tracked的文件(即已經(jīng)放入倉庫中的文件)。
-
git commit --amend
在上一個(gè)commitID上繼續(xù)提交,不新增新的提交,默認(rèn)打開VIM編輯器,是否要修改commit信息
-
git commit --amend --no-edit
可以不修改commit信息直接進(jìn)行提交
如果你沒有設(shè)置 -m 選項(xiàng),Git 會(huì)嘗試為你打開一個(gè)編輯器以填寫提交信息。 如果 Git 在你對(duì)它的配置中找不到相關(guān)信息,默認(rèn)會(huì)打開 vim。
注: 在 Linux 系統(tǒng)中,commit 信息使用單引號(hào) ',Windows 系統(tǒng),commit 信息使用雙引號(hào) "。所以在 git bash 中 git commit -m ‘提交說明’ 這樣是可以的,在 Windows 命令行中就要使用雙引號(hào) git commit -m “提交說明”。
git reset
1. git reset --hard
后面不跟版本號(hào),清除暫存區(qū)和工作區(qū)中tracked的改動(dòng)。不會(huì)清除untracked的改動(dòng)
其中HEAD表示當(dāng)前分支最新版本【請(qǐng)記死】
HEAD^ 表示當(dāng)前版本的前一個(gè)版本,
git reset --hard HEAD^
HEAD^^表示當(dāng)前版本的前前個(gè)版本,也可以使用HEAD~1表示當(dāng)前版本的前一個(gè)版本,HEAD~100表示當(dāng)前版本的前100版本。
提示:這種都表示回退操作
git reset --hrad 版本號(hào)
回到指定的版本,這個(gè)存在兩種情況。
- git reset --hard commit_id
commit_id 是完整的。并且是git log 能夠查到的 否則會(huì)報(bào)錯(cuò)unknown revision or path not in the working tree.
- git reset --hard (通過 git reflog 查到的)
為什么有兩種情況呢,存在這種場(chǎng)景,比方說我們分別提交了兩個(gè)版本1 和 版本2 ,提交順序:版本1在前,版本2在后,當(dāng)前Head指向版本2,現(xiàn)在執(zhí)行g(shù)it reset --hard HEAD^ 回退了一下,git log 看到的只有版本1的情況。即使你知道版本2的完整的commit_id ,執(zhí)行g(shù)it reset --hard commit_id 報(bào)錯(cuò),只能通過
git reset --hard b79613 切換到版本2。
git reset --hrad origin/《分支名》
回退到某個(gè)遠(yuǎn)程分支某個(gè)commit。
有這樣的場(chǎng)景,我們和遠(yuǎn)程分支相同的內(nèi)容下,又做了修改,但是又想回退到和遠(yuǎn)程分支相同的情況,就可以執(zhí)行這個(gè)。
2. git reset HEAD
撤銷暫存區(qū)中的修改,從暫存區(qū)回到了工作區(qū),既提交了,想撤回。但是本地的修改并不會(huì)消失(工作區(qū)的內(nèi)容不會(huì)改變)。
-
git reset HEAD …
撤銷指定文件的add
也可以指定不同版本的file -
git reset HEAD *
撤銷本地add的所有文件
-
git reset HEAD *.txt
3. git reset --hard
git reflog
可以查看所有版本的歷史信息
git reflog命令中保留了從clone倉庫開始,用戶所有在本地庫中的操作。
參考:https://www.jianshu.com/p/7e4cef3863e7
git log
git log
命令只可以查看到HEAD指針及其之前的版本信息,如果版本發(fā)生過回退操作,則可能會(huì)出現(xiàn),HEAD指針之后仍存在歷史提交版本的情況,而這些提交版本信息通過git log
命令是看不到的。
git checkout
-
git checkout -- <文件> <文件> ...
git checkout -- <文件>來丟棄工作區(qū)指定文件的改動(dòng)
2. git checkout *
丟棄工作區(qū)中所有文件的改動(dòng)
git checkout -- *.txt
git diff
對(duì)比兩個(gè)版本的差異
-
git diff
對(duì)比的是工作區(qū)修改之前和修改之后的差異。
-
git diff 版本1 版本2
對(duì)比的是版本1 和版本2 之間的差異
git diff HEAD HEAD^
-
git diff 分支1 分支2
-
git diff 文件
git stash
場(chǎng)景: 當(dāng)你接到一個(gè)修復(fù)一個(gè)代號(hào)001的bug的任務(wù)時(shí),很自然地,你想創(chuàng)建一個(gè)分支bug-001來修復(fù)它,但是,等等,當(dāng)前分支正在上進(jìn)行的工作還沒有提交:
并不是你不想提交,而是工作只進(jìn)行到一半,還沒法提交,預(yù)計(jì)完成還需1天時(shí)間。但是,必須在兩個(gè)小時(shí)內(nèi)修復(fù)該bug,怎么辦?
git stash :git還提供了一個(gè)stash功能,可以把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏“起來,等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作。即緩存起來。
-
git stash save "save message"
執(zhí)行存儲(chǔ)時(shí),添加備注,方便查找,只有g(shù)it stash 也要可以的,但查找時(shí)不方便識(shí)別。 -
git stash list
查看stash了哪些存儲(chǔ) -
git stash show
顯示做了哪些改動(dòng),默認(rèn)show第一個(gè)存儲(chǔ),如果要顯示其他存貯,后面加stash@{$num}
,比如第二個(gè)git stash show stash@{1}
-
git stash apply
應(yīng)用某個(gè)存儲(chǔ),但不會(huì)把存儲(chǔ)從存儲(chǔ)列表中刪除,默認(rèn)使用第一個(gè)存儲(chǔ),即stash@{0}
,如果要使用其他個(gè),git stash apply stash@{$num}
, 比如第二個(gè):git stash apply stash@{1}
-
git stash pop
命令恢復(fù)之前緩存的工作目錄,將緩存堆棧中的對(duì)應(yīng)stash刪除,并將對(duì)應(yīng)修改應(yīng)用到當(dāng)前的工作目錄下,默認(rèn)為第一個(gè)stash,即stash@{0}
,如果要應(yīng)用并刪除其他stash,命令:git stash pop stash@{$num}
,比如應(yīng)用并刪除第二個(gè):git stash pop stash@{1}
-
git stash drop stash@{$num}
丟棄stash@{$num}
存儲(chǔ),從列表中刪除這個(gè)存儲(chǔ) -
git stash clear
刪除所有緩存的stash -
注意 untracked的文件,執(zhí)行stash是不會(huì)被存儲(chǔ)的。
新建了一個(gè)e.txt,e.txt并沒有被加入到版本控制,git add 把文件加入到版本控制之后才行。
git rebase
參考:
https://blog.csdn.net/weixin_42310154/article/details/119004977
https://blog.csdn.net/qq_39512532/article/details/110260369
git branch
后面什么都不寫,列出所有本地分支
-
git branch -r
列出所有遠(yuǎn)程分支
-
git branch -a
列出所有本地分支和遠(yuǎn)程分支
-
git branch <分支名>
創(chuàng)建分支
-
git checkoout -b <分支名>
創(chuàng)建并切換分支
-
git checkout -b 本地分支名x origin/遠(yuǎn)程分支名x
使用該方式會(huì)在本地新建分支x,并自動(dòng)切換到該本地分支x。采用此種方法建立的本地分支會(huì)和遠(yuǎn)程分支建立映射關(guān)系(跟蹤遠(yuǎn)程分支)。
-
git checkout <分支名>
切換分支
-
git merge <分支名>
合并分支到當(dāng)前分支
-
git branch -d <分支名>
刪除分支
-
git branch -m <舊分支名字> <新分支名字>
git branch -m master main
把master分支名字,改為新分支名字。
git clean
-
git clean -f
刪除當(dāng)前目錄下所有untracked的文件. 它不會(huì)刪除.gitignore文件里面指定 的文件夾和文件, 不管這些文件有沒有被track過
-
git clean -df
刪除當(dāng)前目錄下沒有untracked的文件和文件夾
和git reset --hard 是一對(duì)好基友,結(jié)合使用他們能讓你的工作目錄完全回退到最近一次commit的時(shí)候
git remote
如果想查看已經(jīng)配置的遠(yuǎn)程倉庫服務(wù)器,可以運(yùn)行 git remote 命令。 它會(huì)列出指定的每一個(gè)遠(yuǎn)程服務(wù)器的簡(jiǎn)寫。 如果已經(jīng)克隆了遠(yuǎn)程倉庫,那么至少應(yīng)該能看到 origin ,這是 Git 克隆的倉庫服務(wù)器的默認(rèn)名字
-
git remote
-
git remote -v
-
git remote add 添加一個(gè)新的遠(yuǎn)程 Git 倉庫,同時(shí)指定一個(gè)可以引用的簡(jiǎn)寫
這個(gè)使用場(chǎng)景式:我本地已經(jīng)創(chuàng)建了git倉庫,但是我想和遠(yuǎn)程倉庫建立聯(lián)系。即通過git remote add <shortname> <url>
添加遠(yuǎn)程倉庫。
-
git remote rm
如果因?yàn)橐恍┰蛳胍瞥粋€(gè)遠(yuǎn)程倉庫 ,可以使用 git remote rm
注意:此命令只是從本地移除遠(yuǎn)程倉庫的記錄,并不會(huì)真正影響到遠(yuǎn)程倉庫
git fetch
git fetch 是從遠(yuǎn)程倉庫獲取最新版本到本地倉庫,不會(huì)自動(dòng)merge
git pull
git pull 是從遠(yuǎn)程倉庫獲取最新版本并merge到本地倉庫
如果當(dāng)前本地倉庫不是從遠(yuǎn)程倉庫克隆,而是本地創(chuàng)建的倉庫,并且倉庫中存在文件,此時(shí)再從遠(yuǎn)程倉庫拉取文件的時(shí)候會(huì)報(bào)錯(cuò)(fatal: refusing to merge unrelated histories ),解決此問題可以在git pull命令后加入?yún)?shù)**–allow-unrelated-histories**
git push
當(dāng)你想分享你的代碼時(shí),可以將其推送到遠(yuǎn)程倉庫。 命令形式:git push [remote-name] [branch-name]
遠(yuǎn)程倉庫 master分支多了 hello.txt文件。
git push <遠(yuǎn)程主機(jī)名> <本地分支名> : <遠(yuǎn)程分支名>
git push origin HEAD:refs/for/master
git push 肯定是推送
origin : 是遠(yuǎn)程的庫的名字
HEAD: 是一個(gè)特別的指針,它是一個(gè)指向你正在工作的本地分支的指針,
可以把它當(dāng)做本地分支的別名,git這樣就可以知道你工作在哪個(gè)分支
refs/for :這個(gè)不是git的規(guī)則,而是gerrit的規(guī)則, 意義在于我們提交代碼到服務(wù)器之后是需要經(jīng)過 code review 之后才能進(jìn)行merge的
refs/heads: 不需要
簡(jiǎn)單來說: refs/for/mybranch需要經(jīng)過code review之后才可以提交;refs/heads/mybranch不需要code review
git blame
git blame用來追溯一個(gè)指定文件的歷史修改記錄
git blame用來追溯一個(gè)指定文件的歷史修改記錄。它是顯示任何文件中每行最后一次修改的提交記錄。 所以,如果你在代碼中看到有一個(gè)bug,你可以使用 git blame 標(biāo)注這個(gè)文件,查看哪一次提交引入了這行。
命令用法:
git blame filename
可以使用 -L 指定文件的行數(shù)范圍:
git blame -L n1,n2 filename
舉例
git blame -L 69,82 Makefile 查看Makefile這個(gè)文件第69--82行最近一次的修改記錄
git 常用舉例
git log輸出格式
git log --pretty
是指定Git log命令的輸出格式。
git log --pretty=oneline // 將每個(gè)commit 以一行顯示。包括了commit的SHA-1值和提交信息的第一行
查看一個(gè)文件提交的提交記錄
查看一個(gè)文件的提交記錄
git log filename // git log 直接與文件相關(guān)的提交記錄
git log --pretty=oneline filename
查看單個(gè)文件提交記錄及內(nèi)容
git log -p filename
查看某次提交中的某個(gè)文件變化
git show commitId filename //使用git show命令 后跟commitId和文件名
顯示每次提交的diff
git log -p filename
其他問題
- 克隆http和ssh有什么區(qū)別?
http不管你是誰,都可以下載【克隆】/提交項(xiàng)目代碼。每次提交代碼需要你輸入用戶名和密碼;
SSH,如果你的電腦需要與github上的倉庫交互,那么就要把你的電腦的ssh公鑰添加到這個(gè)github賬戶上。
比如工作中你是ZXC這個(gè)項(xiàng)目組的成員,擁有者,你把你每天的代碼——本地電腦跟github上公司項(xiàng)目交互,你得是這個(gè)項(xiàng)目的成員或者擁有者才能提交代碼,這個(gè)方式就不需要輸入用戶名和密碼提交代碼,直接提交。工作中,你的老大會(huì)找你要你的github賬號(hào),邀請(qǐng)你到項(xiàng)目組,你是小組成員,為了方便提交代碼,此時(shí)用SSH方式,工作中都是這種方式。SSH方式有一個(gè)條件要記住:你是項(xiàng)目的擁有者或組成員才可以使用此方法。知道這些就夠了。
分支管理
(1)一開始的時(shí)候,master分支是一條線,git用master指向最新的提交,再用HEAD指向master,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點(diǎn):
每次提交,master分支都會(huì)向前移動(dòng)一步,這樣,隨著你不斷提交,master分支的線也越來越長(zhǎng)
(2)當(dāng)我們創(chuàng)建新的分支,例如dev時(shí),git新建了一個(gè)指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當(dāng)前分支在dev上:
git創(chuàng)建一個(gè)分支很快,因?yàn)槌嗽黾右粋€(gè)dev指針,改變HEAD的指向,工作區(qū)的文件都沒有任何變化。
3)不過,從現(xiàn)在開始,對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了,比如新提交一次后,dev指針往前移動(dòng)一步,而master指針不變:
(4)假如我們?cè)赿ev上的工作完成了,就可以把dev合并到master上。git怎么合并呢?最簡(jiǎn)單的方法,就是直接把master指向dev的當(dāng)前提交,就完成了合并:
git合并分支也很快,就改改指針,工作區(qū)內(nèi)容也不變。
(5)合并完分支后,甚至可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,我們就剩下了一條master分支:
合并模式
- Fast-forward信息,Git告訴我們,這次合并是“快進(jìn)模式“,也就是直接把master指向dev的當(dāng)前提交,僅僅是更新了分支的指針,不會(huì)產(chǎn)生合并提交,所以合并速度非??臁?strong>默認(rèn)的合并行為。
- 合并沖突,遇到合并沖突的時(shí)候,需要處理沖突內(nèi)容,然后再add、commit提交。
- 但是有些快速合并不能成功而且合并時(shí)沒有沖突,這個(gè)時(shí)候git會(huì)幫我們?cè)诤喜⒅笞鲆淮涡碌奶峤?/strong>,但這種模式下,刪除分支后,會(huì)丟掉分支信息。使用的命令是
git merge --no-ff <分支名稱>
不使用默認(rèn)快速合并。
合并沖突
在master分支和dev分支對(duì)code.text文件有相同的位置修改了內(nèi)容。合并兩個(gè)分支的時(shí)候就會(huì)有沖突。
git用<<<<<<<<,========,>>>>>>>>標(biāo)記不同分支的內(nèi)容,我們修改如下后保存:
手動(dòng)解決的方法就是刪除箭頭所指。然后再提交。
git 打補(bǔ)丁
參考:Git 補(bǔ)丁 —— diff 和 patch 使用詳解
注意事項(xiàng)
- 跨系統(tǒng)拷貝git的代碼,(比方說,你在Linux上拉取的代碼,直接復(fù)制到Windows上去執(zhí)行g(shù)it操作),由于文件的屬性變了,所以git操作會(huì)出現(xiàn)一些問題。如果想要在Windows上操作,盡量跨系拷貝,直接拉取代碼即可。
參考鏈接:
強(qiáng)推:https://blog.csdn.net/YJG7D314/article/details/104551896