Git_learn學(xué)習(xí)
目錄
- 1.基礎(chǔ)設(shè)置
-
2.關(guān)聯(lián)倉庫
- 設(shè)置姓名和郵箱地址
- 關(guān)聯(lián)本地倉庫到gitee
-
3.git基本知識
- git?init——初始化倉庫
- git?status——查看倉庫的狀態(tài)
- git?add——向暫存區(qū)中添加文件
- git?commit——保存?zhèn)}庫的歷史記錄
- git push——推送至遠(yuǎn)程倉庫
- git?log——查看提交日志
- git?diff——查看更改前后的差別
- 忽略某些文件
-
4.分支的操作
- 什么是分支的操作?
- git?branch——顯示分支一覽表
- git?checkout? - b——創(chuàng)建、切換分支
- git checkout branchname
- 分支的初步運(yùn)用
- git?merge——合并分支
- git?log? – graph——以圖表形式查看分支
-
5.更改提交的操作
- git?reset——回溯歷史版本
參考:
菜鳥教程——git:https://www.runoob.com/git/git-workspace-index-repo.html
Pro Git(中文版):https://git.oschina.net/progit/
《GitHub入門與實(shí)踐》
本博客用到的代碼在:https://gitee.com/lazyone/git_learn.git,供大家參考。
1.基礎(chǔ)設(shè)置
為了學(xué)習(xí)git,初始化了一個倉庫,倉庫地址:https://gitee.com/lazyone/git_learn.git
此外用一些基礎(chǔ)的c++語言來做相關(guān)的實(shí)驗(yàn),界面使用vscode,里面插件那些也挺好用的。
src里面就一個main.cpp,使用cmake進(jìn)行編譯。
2.關(guān)聯(lián)倉庫
設(shè)置姓名和郵箱地址
git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@example.com"
通過上述兩行命令可以在“~/.gitconfig”中以如下形式輸出設(shè)置文件
[user]
name = Firstname Lastname
email = your_email@example.com
想更改這些信息時,可以直接編輯這個設(shè)置文件。這里設(shè)置的姓名和郵箱地址會用在 Git 的提交日志中。
ps:使用
git config --global color.ui auto
代碼可以讓命令的輸出擁有更高的可讀性。
參考:《GitHub入門與實(shí)踐》
關(guān)聯(lián)本地倉庫到gitee
確認(rèn)設(shè)置好姓名和郵箱后,拉取倉庫的地址
git remote add origin https://你的地址
# 之后輸入
git push -u origin "master"
輸入上述指令后,輸入你的賬號密碼即可成功關(guān)聯(lián)到gitee倉庫了。
當(dāng)然你也可以先在gitee上創(chuàng)建倉庫,然后再通過git clone克隆到本地,這里就不多介紹。
3.git基本知識
git?init——初始化倉庫
執(zhí)行了 git init命令的目錄下就會生成 .git 目錄。這個 .git 目錄里存儲著管理當(dāng)前目錄內(nèi)容所需的倉庫數(shù)據(jù)。
“在 Git 中,我們將這個目錄的內(nèi)容稱為“附屬于該倉庫的工作樹”。文件的編輯等操作在工作樹中進(jìn)行,然后記錄到倉庫中,以此管理文件的歷史快照。如果想將文件恢復(fù)到原先的狀態(tài),可以從倉庫中調(diào)取之前的快照,在工作樹中打開。開發(fā)者可以通過這種方式獲取以往的文件。”——《GitHub入門與實(shí)踐》
git?status——查看倉庫的狀態(tài)
git status命令用于顯示 Git 倉庫的狀態(tài)。這是一個十分常用的命令。
執(zhí)行玩git push指令后,使用git status后會顯示
如果你在本地新增或者改變了文件后,在使用git status則會顯示
這里我修改了main.cpp文件,以及新增了一個頭文件與cpp文件,因此顯示上圖。
#ifndef __POINT_H__
#define __POINT_H__
#include <iostream>
class Point {
private:
/* data */
int x, y;
public:
Point(int xx, int yy);
~Point();
void showPoint();
};
#endif // __POINT_H__
#include "Point.h"
Point::Point(int xx, int yy) {
this->x = xx;
this->y = yy;
std::cout << "Point's Constructor." << std::endl;
}
Point::~Point() { std::cout << "Point's Destructor." << std::endl; }
void Point::showPoint() {
std::cout << "X:" << this->x << "|" << "Y:" << this->y << std::endl;
}
#include <iostream>
#include "Point.h"
int main(int, char**) {
Point p1(1,1);
p1.showPoint();
std::cout << "Hello, world!\n";
}
vscode還能顯示修改的地方,下圖是修改前的版本和修改后的版本。
這里需要明了git的工作區(qū)、暫存區(qū)和版本庫的概念
參考:https://www.runoob.com/git/git-workspace-index-repo.html
- 工作區(qū)(工作樹): 就是你在電腦里能看到的目錄。
- 暫存區(qū): 英文叫 stage 或 index。一般存放在 .git 目錄下的 index 文件(.git/index)中,所以我們把暫存區(qū)有時也叫作索引(index)。
- 版本庫: 工作區(qū)有一個隱藏目錄 .git,這個不算工作區(qū),而是 Git 的版本庫。
下面這個圖展示了工作區(qū)、版本庫中的暫存區(qū)和版本庫之間的關(guān)系:
git?add——向暫存區(qū)中添加文件
如果只是在工作樹中創(chuàng)建了文件,那么該文件并不會被記入 Git 倉庫的版本管理對象當(dāng)中。因此我們用 git status命令查看創(chuàng)建文件時,它會顯示在 Untracked files 里。要想讓文件成為 Git 倉庫的管理對象,就需要用 git add命令將其加入暫存區(qū)(Stage 或者 Index)中。暫存區(qū)是提交之前的一個臨時區(qū)域。
git add .
# 或者想上傳某個指定文件
# git add 指定文件
執(zhí)行完git add .
再執(zhí)行git status
后可以看到,編輯和新增的文件都有了顯示。
git?commit——保存?zhèn)}庫的歷史記錄
git commit命令可以將當(dāng)前暫存區(qū)中的文件實(shí)際保存到倉庫的歷史記錄中。通過這些記錄,我們就可以在工作樹中復(fù)原文件。
git commit -m "First commit"
# -m 參數(shù)后的 "First commit"稱作提交信息,是對這個提交的
概述。
執(zhí)行后終端會顯示如左圖結(jié)果所示。執(zhí)行完 git commit命令后再來查看當(dāng)前狀態(tài)則會顯示右圖狀態(tài)。
當(dāng)前工作樹處于剛剛完成提交的最新狀態(tài),所以結(jié)果顯示沒有更改。
git push——推送至遠(yuǎn)程倉庫
git push
是一個Git命令,用于將本地Git倉庫中的代碼推送到遠(yuǎn)程存儲庫。在使用git push
命令時,需要指定以下兩個參數(shù):
-
<remote>
:遠(yuǎn)程存儲庫的別名,Git存儲庫可以與多個遠(yuǎn)程存儲庫進(jìn)行通信,每個遠(yuǎn)程存儲庫都需要有一個唯一的別名。默認(rèn)情況下,Git會將遠(yuǎn)程存儲庫的別名設(shè)置為“origin”,它表示默認(rèn)的遠(yuǎn)程存儲庫。 -
<branch>
:要推送的分支名,此參數(shù)指定了本地哪個分支應(yīng)該被推送到目標(biāo)存儲庫中。默認(rèn)情況下,Git會將當(dāng)前分支推送到目標(biāo)存儲庫。
git push -u origin master
執(zhí)行上述命令后
推送后,之前提交的就被推送到遠(yuǎn)程倉庫中去了
git?log——查看提交日志
git log命令可以查看以往倉庫中提交的日志。
git log
# git log --pretty=short:只顯示提交信息的第一行
# git log 文件名:只顯示指定目錄、文件的日志
# git log -p:顯示文件的改動
# git log -p 2:用 -2 則僅顯示最近的兩次更新
# git log --stat:在做代碼審查,或者要快速瀏覽其他協(xié)作者提交的更新都作了哪些改動時,就可以用這個選項(xiàng)
如上圖所示,屏幕顯示了剛剛的提交操作。commit 欄旁邊顯示的“ddc……”
是指向這個提交的哈希值。Git 的其他命令中,在指向提交時會用到這個哈希值。Author 欄中顯示我們給 Git 設(shè)置的用戶名和郵箱地址。Date 欄中顯示提交執(zhí)行的日期和時間。再往下就是該提交的提交信息。
git?diff——查看更改前后的差別
git diff命令可以查看工作樹、暫存區(qū)、最新提交之間的差別。這里先在main.cpp中新增一行代碼std::cout << "git diff" << std::endl;
,執(zhí)行 git diff命令,查看當(dāng)前工作樹與暫存區(qū)的差別。
git diff
# git diff HEAD # 要查看與最新提交的差別,請執(zhí)行該命令
# git diff --cached # 已經(jīng)暫存起來的文件和上次提交時的快照之間的差異
# git diff --staged # 同上,1.6.1才有
由于我們尚未用 git add命令向暫存區(qū)添加任何東西,所以程序只會顯示工作樹與最新提交狀態(tài)之間的差別。這里解釋一下顯示的內(nèi)容?!?”號標(biāo)出的是新添加的行,被刪除的行則用“-”號標(biāo)出。我們可以看到,這次只添加了一行。
執(zhí)行玩git diff后在執(zhí)行g(shù)it add .后,執(zhí)行g(shù)it diff就不會顯示任何消息了,可以用git diff HEAD
顯示最近一次的提交差別。
“不妨養(yǎng)成這樣一個好習(xí)慣:在執(zhí)行 git commit命令之前先執(zhí)行g(shù)it diff HEAD命令,查看本次提交與上次提交之間有什么差別,等確認(rèn)完畢后再進(jìn)行提交。這里的 HEAD 是指向當(dāng)前分支中最新一次提交的指針?!薄禛itHub入門與實(shí)踐》
修改過后,執(zhí)行g(shù)it commit命令。并查看下log成功顯示第二個提交。
忽略某些文件
一般我們總會有些文件無需納入 Git 的管理,也不希望它們總出現(xiàn)在未跟蹤文件列表。通常都是些自動生成的文件,比如日志文件,或者編譯過程中創(chuàng)建的臨時文件等。我們可以創(chuàng)建一個名為 .gitignore
的文件,列出要忽略的文件模式?!禤ro Git(中文版)》
文件 .gitignore
的格式規(guī)范如下:
- 所有空行或者以注釋符號
#
開頭的行都會被 Git 忽略。 - 可以使用標(biāo)準(zhǔn)的 glob 模式匹配。
- 匹配模式最后跟反斜杠(
/
)說明要忽略的是目錄。 - 要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(
!
)取反。
# gitignore文件中內(nèi)容
build/*
.vscode/*
我的.gitignore中就忽略了vs的文件夾設(shè)置,cmake生成的build文件夾。
4.分支的操作
什么是分支的操作?
分支是Git版本控制中的一個非常重要的概念和操作。在Git中,分支是指指向版本庫中特定提交記錄的指針。在一個Git項(xiàng)目中,主要的分支是master
分支,它通常用來表示項(xiàng)目的穩(wěn)定狀態(tài)。而其他的分支則被用于開發(fā)新功能、修復(fù)問題等任務(wù)。
使用Git分支,你可以基于一個已經(jīng)存在的分支創(chuàng)建一個新的分支,這與創(chuàng)建一個完全獨(dú)立的版本類似。在不影響其他團(tuán)隊(duì)成員工作的情況下,你可以在新分支上編寫新代碼、修改已有代碼、提交變更等等。之后,你可以將此新分支合并到原始分支中,這將導(dǎo)致原始分支的代碼與新分支代碼的結(jié)合。
Git分支操作是實(shí)現(xiàn)并發(fā)多版本控制的基礎(chǔ)。在Git中,分支的創(chuàng)建、切換、合并、刪除等操作都是非常容易的,提供了非常靈活的分支管理能力。
git?branch——顯示分支一覽表
git branch
:列出所有的本地分支,包括當(dāng)前所在分支。
ps:為了導(dǎo)出文檔方便,將圖片替換成代碼塊的方式展示
G:\workspace\git\git_learn>git branch
* master
可以看到 master 分支左側(cè)標(biāo)有“ *”(星號),表示這是我們當(dāng)前所在的分支。
git?checkout? - b——創(chuàng)建、切換分支
git branch -b branchname
:創(chuàng)建一個新的分支,并切換到這個分支。branchname
是新建分支的名稱。
G:\workspace\git\git_learn>git checkout -b feature-A
Switched to a new branch 'feature-A'
這里創(chuàng)建了feature-A的分支,并切換過去了,這是如果再次運(yùn)行git branch
,則會出現(xiàn):
G:\workspace\git\git_learn>git branch
* feature-A
master
當(dāng)前就在feature-A分支中
git checkout branchname
git checkout branchname
:切換到一個已經(jīng)存在的分支。branchname
是需要切換的分支名稱。
G:\workspace\git\git_learn>git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
G:\workspace\git\git_learn>git branch
feature-A
* master
當(dāng)前切換到master分支中
分支的初步運(yùn)用
首先切換到feature-A分支中
在feature-A分支中修改Point.cpp文件與Point.h文件
#ifndef __POINT_H__
#define __POINT_H__
#include <iostream>
class Point {
private:
/* data */
int x, y, z;
public:
Point(int xx, int yy, int zz);
~Point();
void showPoint();
};
#endif // __POINT_H__
#include "Point.h"
Point::Point(int xx, int yy, int zz) {
this->x = xx;
this->y = yy;
this->z = zz;
std::cout << "Point's Constructor." << std::endl;
}
Point::~Point() { std::cout << "Point's Destructor." << std::endl; }
void Point::showPoint() {
std::cout << "X:" << this->x << "|" << "Y:" << this->y << "|" << "Z:"<< this->z<< std::endl;
}
這里將點(diǎn)的維度增加到三維,并按照之前的方式進(jìn)行推送
G:\workspace\git\git_learn>git add .
G:\workspace\git\git_learn>git commit -m "feature"
[feature-A 8c14abb] feature
3 files changed, 6 insertions(+), 5 deletions(-)
G:\workspace\git\git_learn>git push -u origin feature-A
Enter passphrase for key '/c/Users/pzq/.ssh/id_rsa':
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 6 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 526 bytes | 526.00 KiB/s, done.
Total 6 (delta 4), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
remote: Create a pull request for 'feature-A' on Gitee by visiting:
remote: https://gitee.com/lazyone/git_learn/pull/new/lazyone:feature-A...lazyone:master
To gitee.com:lazyone/git_learn.git
* [new branch] feature-A -> feature-A
branch 'feature-A' set up to track 'origin/feature-A'.
此時我們的遠(yuǎn)程倉庫中多了一個feature-A分支
切換到master分支,發(fā)現(xiàn).cpp與.h文件中Point類還是二維的,說明我們對feature-A分支中的代碼進(jìn)行改動,不會影響到master分支中。
Git分支的優(yōu)點(diǎn)在于它可以讓開發(fā)者在新功能開發(fā)的同時不影響已經(jīng)發(fā)布并穩(wěn)定的版本,從而真正實(shí)現(xiàn)了迭代式開發(fā)。
git?merge——合并分支
接下來,我們假設(shè) feature-A 已經(jīng)實(shí)現(xiàn)完畢,想要將它合并到主干分支 master 中。首先切換到 master 分支。然后合并 feature-A 分支。為了在歷史記錄中明確記錄下本次分支合并,我們需要創(chuàng)建合并提交。因此,在合并時加上 --no-ff參數(shù)。
G:\workspace\git\git_learn>git checkout master
Already on 'master'
Your branch is up to date with 'origin/master'.
G:\workspace\git\git_learn>git merge --no-ff feature-A
Merge made by the 'ort' strategy.
src/Point.cpp | 5 +++--
src/Point.h | 4 ++--
src/main.cpp | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
這樣一來,feature-A 分支的內(nèi)容就合并到 master 分支中了。
git?log? – graph——以圖表形式查看分支
用 git log --graph
命令進(jìn)行查看的話,能很清楚地看到特性分支(feature-A)提交的內(nèi)容已被合并。除此以外,特性分支的創(chuàng)建以及合并也都清楚明了
G:\workspace\git\git_learn>git log --graph
* commit 47a17a4b46b9af720fb0f26535b067b1c8a22b85 (HEAD -> master)
|\ Merge: 07b4a48 8c14abb
| | Author: lazyone <emal>
| | Date: Tue Apr 18 13:07:43 2023 +0800
| |
| | Merge branch 'feature-A'
| |
| * commit 8c14abbbcf2d343774c200e2cb28a080740c3d94 (origin/feature-A, feature-A)
| | Author: lazyone <emal>
| | Date: Tue Apr 18 12:58:12 2023 +0800
| |
| | feature
| |
* | commit 07b4a483109f4627c320aed57629db524da6fd8f (origin/master, origin/HEAD)
|/ Author: lazyone <emal>
| Date: Tue Apr 18 11:39:45 2023 +0800
| Date: Tue Apr 18 11:39:45 2023 +0800
|
| readme
5.更改提交的操作
git?reset——回溯歷史版本
根據(jù)git log --graph
的輸出,我們可以簡單畫出版本的迭代情況,如圖所示
那如果想要回溯版本,回到二維點(diǎn)的時候,可以運(yùn)行git reset —hard
加上目標(biāo)時間點(diǎn)的哈希值就可以
G:\workspace\git\git_learn>git reset --hard 07b4a483109f4627c320aed57629db524da6fd8f
HEAD is now at 07b4a48 readme
這里通過指令回到了二維點(diǎn)的時候,通過指令創(chuàng)建了分支feature-B
G:\workspace\git\git_learn>git checkout -b feature-B
Switched to a new branch 'feature-B'
在feature-B中,向main.cpp中添加一行指令
#include <iostream>
#include "Point.h"
int main(int, char**) {
Point p1(1,1);
p1.showPoint();
std::cout << "Hello, world!\n";
std::cout << "git diff" << std::endl;
std::cout << "add feature-B" << std::endl;
}
然后執(zhí)行add和commit指令。
目前本地倉庫的狀態(tài)就變成了下圖所示的狀態(tài)
如果我的期望狀態(tài)是對feature-A分支進(jìn)行合并后,又對feature-B進(jìn)行合并,即下圖所示
則相關(guān)步驟為:
- 切換到master分支
- git reflog查看merge操作后的時間哈希值
G:\workspace\git\git_learn>git reflog 07b4a48 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: checkout: moving from feature-B to master 07bf69a (feature-B) HEAD@{1}: commit: feature-B 07b4a48 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: checkout: moving from master to feature-B 07b4a48 (HEAD -> master, origin/master, origin/HEAD) HEAD@{3}: checkout: moving from feature-B to master 07b4a48 (HEAD -> master, origin/master, origin/HEAD) HEAD@{4}: checkout: moving from master to feature-B 07b4a48 (HEAD -> master, origin/master, origin/HEAD) HEAD@{5}: reset: moving to 07b4a483109f4627c320aed57629db524da6fd8f 47a17a4 HEAD@{6}: checkout: moving from feature-A to master 8c14abb (origin/feature-A, feature-A) HEAD@{7}: checkout: moving from master to feature-A 47a17a4 HEAD@{8}: checkout: moving from feature-A to master 8c14abb (origin/feature-A, feature-A) HEAD@{9}: checkout: moving from master to feature-A 47a17a4 HEAD@{10}: merge feature-A: Merge made by the 'ort' strategy. 07b4a48 (HEAD -> master, origin/master, origin/HEAD) HEAD@{11}: checkout: moving from master to master 07b4a48 (HEAD -> master, origin/master, origin/HEAD) HEAD@{12}: checkout: moving from feature-A to master 8c14abb (origin/feature-A, feature-A) HEAD@{13}: checkout: moving from master to feature-A
- 進(jìn)行版本回溯
G:\workspace\git\git_learn>git reset --hard 47a17a4 HEAD is now at 47a17a4 Merge branch 'feature-A'
- 合并feature-B分支
G:\workspace\git\git_learn>git merge --no-ff feature-B Auto-merging src/main.cpp Merge made by the 'ort' strategy. src/main.cpp | 1 + 1 file changed, 1 insertion(+)
至此,分支合并完成,運(yùn)行git log —graph
可以查看相關(guān)操作
* commit d5c04fedd5ea32152426a433a0ae0e2848790330 (HEAD -> master)
|\ Merge: 47a17a4 07bf69a
| | Author: lazyone <emal>
| | Date: Tue Apr 18 13:48:13 2023 +0800
| |
| | Merge branch 'feature-B'
| |
| * commit 07bf69a170c2e4964f937cf8bf5d2effcd7db654 (feature-B)
| | Author: lazyone <emal>
| | Date: Tue Apr 18 13:42:23 2023 +0800
| |
| | feature-B
| |
* | commit 47a17a4b46b9af720fb0f26535b067b1c8a22b85
|\ \ Merge: 07b4a48 8c14abb
| |/ Author: lazyone <emal>
|/| Date: Tue Apr 18 13:07:43 2023 +0800
| |
| | Merge branch 'feature-A'
| |
| * commit 8c14abbbcf2d343774c200e2cb28a080740c3d94 (origin/feature-A, feature-A)
| | Author: lazyone <emal>
| | Date: Tue Apr 18 12:58:12 2023 +0800
| |
| | feature
從上述案例中可以查看git的強(qiáng)大,這還是git的基本功能。
此時feature-B已經(jīng)沒用了,想要刪除運(yùn)行git branch -d feature-B
即可文章來源:http://www.zghlxwxcb.cn/news/detail-762929.html
G:\workspace\git\git_learn>git branch -d feature-B
Deleted branch feature-B (was 07bf69a).
git 還有其他很多操作,這里等以后有空在寫,如果文章有錯誤,歡迎批評指正。文章來源地址http://www.zghlxwxcb.cn/news/detail-762929.html
到了這里,關(guān)于創(chuàng)造一個自己的gitee倉庫——Git的基本操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!