目錄
- 一、git概述
- 二、Git 與 SVN 區別
- 三、Git下載安裝
- 四、Git 作業流程
- 五、Git 作業區、暫存區和版本庫
- 六、Git 創建倉庫
- 配置
- 1、查看配置
- 2、編輯 git 組態檔
- 3、設定提交代碼時的用戶資訊
- 配置
- 七、Git 基本操作
- 1)不同區說明
- 2)一個簡單的操作步驟
- 3)創建倉庫命令
- 4)提交與修改操作
- 1、git add
- 2、git status
- 3、git diff
- 4、git commit
- 5、git reset
- 6、git rm
- 7、git mv
- 5)查看提交日志
- 6)遠程操作
- 1、git remote
- 2、git push
- 1)生成Token
- 2)設定token
- 3)配置github的ssh密鑰--Windows(推薦)
- 3、git pull
- 4、git pull和git fetch的區別
- 7)Git 分支管理
- 1、創建分支
- 2、創建并切換分支
- 3、合并分支
- 5、撤銷修改
- 6、版本回退
- 1)回退到上個版本
- 2)回退到前n次版本
- 3)回滾指定commit id版本(常用/推薦)
- 7、版本沖突解決
- 八、打標簽(tag)
- 1)創建標簽
- 2)洗掉標簽
- 3)查看此版本所修改的內容
- 4)推送標簽到遠程倉庫
- 5)洗掉遠程標簽
- 九、搭建私有倉庫(gitlab)
- 1)配置yum源
- 2)更新本地yum快取
- 3)安裝GitLab社區版
- 4)啟動所有 gitlab 組件
- 5)gitlab修改默認埠
- 1、修改puma埠
- 2、修改nginx埠
- 3、修改giltab-shell配置
- 6)訪問驗證
- 7)Gitlab各組件啟動停止命令
- 1、GitLab(所有服務)
- 2、Nginx
- 3、Puma
- 4、Sidekiq
- 5、PostgreSQL
- 6、Redis
- 8)簡單使用
- 1、新建專案
- 2、生成并配置秘鑰ssh密鑰--Windows(推薦)
- 1)打開Git Bash查看電腦上是否已經存在SSH密鑰
- 2) 創建新的ssh key
- 3)gitlab配置ssh key
- 3、git配置
一、git概述
Git 是一個開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的專案,
-
Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放原始碼的版本控制軟體,
-
Git 與常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本庫的方式,不必服務器端軟體支持,
二、Git 與 SVN 區別

| Git | SVN | |
|---|---|---|
| 資料分布方式 | 分布式 | 集中式 |
| 存盤方式 | 按元資料存,所有的資源控制系統都是把檔案的元資訊隱藏在一個類似 .svn、.cvs 等的檔案夾里 | 按檔案存盤 |
| 版本號 | Git 沒有一個全域的版本號 | SVN 有全域版本號:目前為止這是跟 SVN 相比 Git 缺少的最大的一個特征, |
| 內容完整性 | Git 的內容完整性要優于 SVN,Git 的內容存盤使用的是 SHA-1 哈希演算法, | ~ |
三、Git下載安裝
在使用Git前我們需要先安裝 Git,Git 目前支持
Linux/Unix、Mac和Windows平臺上運行,
Git 各平臺安裝包下載地址為:http://git-scm.com/downloads


接下來就是傻瓜式的一步步操作,很簡單,就不在這里講了,

四、Git 作業流程
一般作業流程如下:
- 克隆 Git 資源作為作業目錄,
- 在克隆的資源上添加或修改檔案,
- 如果其他人修改了,你可以更新資源,
- 在提交前查看修改,
- 提交修改,
- 在修改完成后,如果發現錯誤,可以撤回提交并再次修改并提交,
下圖展示了 Git 的作業流程:

五、Git 作業區、暫存區和版本庫
我們先來理解下 Git 作業區、暫存區和版本庫概念:
- 作業區:就是你在電腦里能看到的目錄,
- 暫存區:英文叫 stage 或 index,一般存放在 .git 目錄下的 index 檔案(.git/index)中,所以我們把暫存區有時也叫作索引(index),
- 版本庫:作業區有一個隱藏目錄 .git,這個不算作業區,而是 Git 的版本庫,
下面這個圖展示了作業區、版本庫中的暫存區和版本庫之間的關系:

六、Git 創建倉庫
Git 使用
git init命令來初始化一個 Git 倉庫, git init 是使用 Git 的第一個命令,在執行完成 git init 命令后,Git 倉庫會生成一個.git目錄,該目錄包含了資源的所有元資料,其他的專案目錄保持不變,
# 該命令執行完后會在當前目錄生成一個 .git 目錄,
$ git init
# 使用我們指定目錄作為Git倉庫,
$ git init test2022

配置
1、查看配置
# 查看配置
$ git config --list

2、編輯 git 組態檔
# .git目錄下執行修改當前倉庫
$ git config -e
# 針對系統上所有倉庫
$ git config -e --global
3、設定提交代碼時的用戶資訊
$ git config --global user.name "bigdata"
$ git config --global user.email [email protected]
七、Git 基本操作
Git 常用的是以下 6 個命令:
git clone、git push、git add、git commit、git checkout、git pull,后面我們會詳細介紹,

1)不同區說明
workspace:作業區staging area:暫存區/快取區local repository:版本庫或本地倉庫remote repository:遠程倉庫
2)一個簡單的操作步驟
- git init - 初始化倉庫,
- git add . - 添加檔案到暫存區,
- git commit - 將暫存區內容添加到倉庫中,
3)創建倉庫命令
上面說過
git init是初始化創建倉庫,還有一個非常常用的,就是git clone拷貝一份遠程倉庫,也就是下載一個專案,
4)提交與修改操作
| 命令 | 說明 |
|---|---|
| git add | 添加檔案到暫存區 |
| git status | 查看倉庫當前的狀態,顯示有變更的檔案, |
| git diff | 比較檔案的不同,即暫存區和作業區的差異, |
| git commit | 提交暫存區到本地倉庫, |
| git reset | 回退版本, |
| git rm | 洗掉作業區檔案, |
| git mv | 移動或重命名作業區檔案, |
1、git add
添加當前目錄下的所有檔案到暫存區:
$ touch HEAD
$ vi HEAD
hello world!!!
$ git status
$ git add .
$ touch hello.java
$ git status -s
$ git add hello.java

2、git status
查看倉庫當前的狀態,顯示有變更的檔案,
git status -s或git status --short命令以精簡的方式顯示檔案狀態,
-
新添加的未跟蹤檔案前面有
??標記, -
新添加到暫存區中的檔案前面有
A標記, -
修改過的檔案前面有
M標記, -
M 有兩個可以出現的位置,出現在右邊的
M表示該檔案被修改了但是還沒放入暫存區,出現在靠左邊的 M 表示該檔案被修改了并放入了暫存區, -
A: 你本地新增的檔案(服務器上沒有).
其它不常用的檔案狀態
-
C: 檔案的一個新拷貝. -
D: 你本地洗掉的檔案(服務器上還在). -
R: 檔案名被修改了, -
T: 檔案的型別被修改了, -
U: 檔案沒有被合并(你需要完成合并才能進行提交), -
X: 未知狀態(很可能是遇到git的bug了,你可以向git提交bug report) -
?:未被git進行管理,可以使用git add file1把file1添加進git能被git所進行管理
3、git diff

workspace:作業區staging area:暫存區/快取區local repository:版本庫或本地倉庫remote repository:遠程倉庫
git diff 有兩個主要的應用場景:
- 【場景一】
git diff命令比較檔案的不同,即比較檔案在暫存區和作業區的差異, - 【場景二】
git diff命令顯示已寫入暫存區和已經被修改但尚未寫入暫存區檔案的區別,
尚未快取的改動:
git diff
查看已快取的改動:git diff --cached
查看已快取的與未快取的所有改動:git diff HEAD
顯示摘要而非整個 diff:git diff --stat
workspace:作業區檔案 與staging area:暫存區/快取區檔案 對比
$ git status -s
# 所以檔案
$ git diff
# 指定檔案對比
$ git diff hello.java

git diff --cached
staging area:暫存區/快取區檔案 與local repository:版本庫或本地倉庫檔案對比
$ git add HEAD
$ git diff --cached

4、git commit
git commit命令將暫存區內容添加到本地倉庫中,
# 所有檔案
$ git commit -m "message"
# 指定檔案
$ git commit hello.java HEAD -m "message"
# -a 引數設定修改檔案后不需要執行 git add 命令,直接來提交
$ echo "test001" > test001
$ echo "test002" > test002
$ git commit -am "messages"

5、git reset
--mixed為默認,可以不用帶該引數,用于重置暫存區的檔案與上一次的提交(commit)保持一致,作業區檔案內容保持不變,
$ git reset HEAD^ # 回退所有內容到上一個版本
$ git reset HEAD^ hello.php # 回退 hello.php 檔案的版本到上一個版本
$ git log --oneline # 查看提交的版本
$ git reset 49c5826 # 回退到指定版本
$ git status # 查看檔案狀態

6、git rm
將檔案從暫存區和作業區中洗掉:git rm <file>
$ git rm hello.java
# 強行從暫存區和作業區中洗掉
$ git rm -f hello.java
# 例從暫存區中洗掉檔案
$ git rm --cached hello.java
# 可以遞回強制洗掉
$ git rm -rf --cached dir
7、git mv
git mv 命令用于移動或重命名一個檔案、目錄或軟連接,
git mv [file] [newfile]
如果新檔案名已經存在,但還是要重命名它,可以使用 -f 引數:
git mv -f [file] [newfile]
$ touch t2022
$ git add t2022
$ git mv t2022 t2023
# 如果t2023存在,-f
$ git mv -f t2022 t2023
$ git status

5)查看提交日志
$ git log
# 一行顯示
$ git log --oneline
# 帶引數--author
$ git log --oneline --author="liugp"
# 帶事件,包含--until,不包含--since,如果兩個時間一樣就包含
$ git log --since="2022.03.05" --until="2022.03.06"

6)遠程操作
1、git remote
$ git remote -v
$ git clone git://github.com/flutter/flutter.git
$ cd flutter
$ git remote -v

顯示某個遠程倉庫的資訊:
# 下載
$ git clone [email protected]:apache/flink.git
# 進入到專案
$ cd flink
# 只顯示名稱
$ git remote show
# 顯示具體資訊
$ git remote -v

添加新的遠程倉庫
- 新建倉庫(GitHub)


$ git remote add GithubTest2022 https://github.com/liugp1116/Test2022.git
$ git remote -v

2、git push
添加遠程倉庫的意義就是將檔案推送到遠程倉庫保存管理【本地倉庫(local repository)-》遠程倉庫(remote repository)】

# origin遠程倉庫別名,master當前倉庫分支名,會出現需要輸入賬號密碼
$ git push GithubTest2022 master
輸入自己GitHub的賬號(當然也可以是gitee、gitlab或者其它,下面也會講)

輸入GitHub的密碼

賬號密碼的這種方式在GitHub上在2021年已經被廢除了,必須使用`個人訪問令牌(personal access token) 的方式進行訪問,配置方式如下:
1)生成Token
-
在個人設定頁面,找到
Setting

-
選擇開發者設定
Developer setting

-
選擇個人訪問令牌
Personal access tokens,然后選中生成令牌Generate new token

-
設定token的有效期,訪問權限等

-
生成令牌
Generate token


【溫馨提示】記得把你的token保存下來,因為你再次重繪網頁的時候,你已經沒有辦法看到它了,
2)設定token
// <your_token>:包括<>在內的全部字符替換成你的token
// <USERNAME>:包括<>在內的全部字符替換成你的username
// <REPO>:包括<>在內的全部字符替換成你要訪問的倉庫名稱
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git
git push GithubTest2022 master
3)配置github的ssh密鑰--Windows(推薦)
- 打開Git Bash查看電腦上是否已經存在SSH密鑰
$ cd ~/.ssh/
- 創建新的ssh key
$ ssh-keygen -t rsa -C "[email protected]"
因為之前就創建過,所以我這邊是覆寫

- 復制ssh key到github
$ cat id_rsa.pub


- 測驗 ssh 鏈接 github
$ ssh -T [email protected]

- 設定自己的git資訊
#(此處name可修改也不是用于登錄github的登錄名)
$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "[email protected]"

- 測驗驗證
$ git remote add ssh_test2022 [email protected]:liugp1116/Test2022.git
$ git remote -v
# 如果遠程倉庫沒有這個分支,會自動創建master分支,跟本地分支名稱一致
$ git push ssh_test2022 master
### git push <遠程主機名> <本地分支名>:<遠程分支名>
$ git push ssh_test2022 master:dev

查看所有分支,紅色代表遠程分支,綠色代表本地分支


- -u引數
# 加了引數-u后,以后即可直接用git push 代替git push origin master
$ git push -u ssh_test2022 master
# 就此關聯起來了,不用再輸入那么長的命令了
$ git push

- 強制推送(--force)
$ git push --force origin master
- 洗掉遠程分支
### 洗掉主機的分支可以使用 --delete 引數,以下命令表示洗掉 origin 主機的 master 分支:
$ git push origin --delete master
3、git pull
### git pull <遠程主機名> <本地分支名>:<遠程分支名>
$ git pull ssh_test2022 master:dev
# 下面三個等價
$ git pull ssh_test2022 master:master
$ git pull ssh_test2022 master
$ git pull
4、git pull和git fetch的區別
git fetch是將遠程主機的最新內容拉到本地,用戶在檢查了以后決定是否合并到作業本機分支中,- 而
git pull則是將遠程主機的最新內容拉下來后直接合并,即:git pull = git fetch + git merge,這樣可能會產生沖突,需要手動解決,
$ git fetch ssh_test2022 master
取回更新后,會回傳一個FETCH_HEAD,指的是某個branch在服務器上的最新狀態,我們可以在本地通過它查看剛取回的更新資訊:
$ git log -p FETCH_HEAD

合并分支
$ git merge FETCH_HEAD

7)Git 分支管理
幾乎每一種版本控制系統都以某種形式支持分支,使用分支意味著你可以從開發主線上分離開來,然后在不影響主線的同時繼續作業,
1、創建分支
$ git branch dev
# 查看本地分支
$ git branch
# 查看遠程分支
$ git branch -r
# 查看所有分支
$ git branch -a

2、創建并切換分支
$ git checkout -b test
### 等價于下面兩句
$ git branch test
$ git checkout test
3、合并分支
一旦某分支有了獨立內容,你終究會希望將它合并回到你的主分支, 你可以使用以下命令將任何分支合并到當前分支中去:
$ git checkout master
# 將dev合并到當前分支(master)
$ git merge dev
5、撤銷修改
- 本地修改沒add添加到暫存區
# 撤銷指定檔案
$ git checkout t1
# 撤銷多檔案,以空格分開
$ git checkout 123.txt t1
# 撤銷所有,很少用,不推薦
$ git checkout .

【溫馨提示】
checkout不僅有撤銷修改,還能切換分支,上面有講過,
- 本地修改已經add添加到暫存區,但是沒commit提交到本地倉庫
用git status查看一下,修改只是添加到了暫存區,還沒有提交,這時用命令git reset HEAD
可以把暫存區的修改撤銷掉(unstage),重新放回作業區,然后再用git checkout -- file 丟棄作業區的修改:
# 把修改add添加到暫存區
$ git add 123.txt
# 暫存區與本地倉庫比較
$ git diff --cached
$ git status
# 指定檔案
$ git reset HEAD -- 123.txt
# 指定多個檔案
$ git reset HEAD -- 123.txt test.txt
# 所有檔案
$ git reset HEAD -- .
6、版本回退
在實際作業中,我們會不斷對檔案進行修改,然后不斷提交修改到版本庫里,一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的一個commit恢復,然后繼續作業,而不是把幾個月的作業成果全部丟失,
在Git中,我們用git log命令查看修改記錄:
查看版本號ID(歷史提交記錄)
$ git log
# 一行顯示
$ git log --oneline
$ git log --pretty=oneline

我們還可以用 --graph 選項,查看歷史中什么時候出現了分支、合并,以下為相同的命令,開啟了拓撲圖選項:
$ git log --graph

1)回退到上個版本
$ git reset --hard HEAD^

2)回退到前n次版本
$ git reset --hard HEAD~3
3)回滾指定commit id版本(常用/推薦)
# 先查找commit id
$ git log
# 一行顯示
$ git log --oneline
$ git log --pretty=oneline
# 回滾,用完整ID也可以用短ID,ID只要唯一就行,可以任意
$ git reset --hard 1c544f1

7、版本沖突解決
在公司里遠程倉庫都是大家公用的,如果沒有更新最新的版本,各自又修改同一個檔案提交到遠程倉庫就會產生沖突,

【解決】
# 先拉取最新的代碼
$ git pull

看上圖提示發現合并的時候產生沖突,打開檔案發現沖突的檔案有兩段最新代碼,一段是自己本地提交的,一段是從遠程拉取下來的,

修改解決沖突,修改完如下內容:

再add-》commit-》push到遠程倉庫,解決沖突
$ git add 123.txt
$ git commit -m "解決沖突"
$ git push
$ git status

八、打標簽(tag)
1)創建標簽
發布一個版本時,我們通常先在版本庫中打一個標簽(tag),這樣就唯一確定了打標簽時刻的版本,將來無論什么時候,取某個標簽的版本,就是把那個打標簽的時刻的歷史版本取出來,
$ git tag
$ git tag v0312
$ git tag
2)洗掉標簽
$ git tag -d v0312
3)查看此版本所修改的內容
# 查看此版本所修改的內容
$ git show v0312

4)推送標簽到遠程倉庫
# 推送一個本地標簽到遠程倉庫
$ git push ssh_test2022 v0312
# 推送全部未推送過的本地標簽
$ git push ssh_test2022 --tags
5)洗掉遠程標簽
# 洗掉一個遠程標簽
$ git push ssh_test2022 :refs/tags/v0312
九、搭建私有倉庫(gitlab)
出于安全和穩定而言,搭建私有本地倉庫是在企業里最常見的,企業里基本上不可能用外網的倉庫作為公司的代碼倉庫,Gitlab官方檔案

圖源:https://docs.gitlab.com/ee/development/architecture.html
- Nginx:靜態web服務器,
- gitlab-shell:用于處理Git命令和修改authorized keys串列,
- gitlab-workhorse: 輕量級的反向代理服務器,
- logrotate:日志檔案管理工具,
- postgresql:資料庫,
- redis:快取資料庫,
- sidekiq:用于在后臺執行佇列任務(異步執行),
- Puma:Puma是一個Ruby應用服務器,用于運行核心Rails應用程式,該應用程式在GitLab中提供面向用戶的功能,這通常以捆綁或配置的形式顯示在行程輸出中,ru取決于GitLab版本,
1)配置yum源
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
$ cat << EOF > /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el8$releasever/
gpgcheck=0
enabled=1
EOF
2)更新本地yum快取
$ yum clean all && yum makecache
【Centos8的問題】
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
【解決】
cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum update -y
3)安裝GitLab社區版
$ yum install gitlab-ce -y

4)啟動所有 gitlab 組件
# 啟動所有服務,使組態檔生效,但是會初始化除了gitlab.rb之外的所有檔案
# 組態檔/etc/gitlab/gitlab.rb
$ gitlab-ctl reconfigure
$ gitlab-ctl status
# 檢查gitlab
$ gitlab-rake gitlab:check SANITIZE=true --trace
其它常用命令
# 停止所有 gitlab 組件;
$ gitlab-ctl stop
# 重啟所有 gitlab 組件;
$ gitlab-ctl restart
#查看日志的命令(Gitlab 默認的日志檔案存放在/var/log/gitlab 目錄下)
$ gitlab-ctl tail # 查看日志;
WEB UI
賬號:root
密碼在這個檔案中:/etc/gitlab/initial_root_password
web ui默認埠:http://192.168.0.113:80

5)gitlab修改默認埠
最有可能被其它行程占用的埠就是
8080和80埠了
1、修改puma埠
組態檔:/etc/gitlab/gitlab.rb,修改puma['port']8080-》8082
puma['port'] = 8083
修改域名
# external_url 'http://gitlab.bigdata.com'
$ sed -i 's/gitlab.example.com/gitlab.bigdata.com/' /etc/gitlab/gitlab.rb
這個記得配置hosts域名映射C:\Windows\System32\drivers\etc\hosts
192.168.0.113 gitlab.bigdata.com
重啟服務
$ gitlab-ctl reconfigure


2、修改nginx埠
組態檔:/var/opt/gitlab/nginx/conf/gitlab-http.conf,修改listen修改*80-》*8088
重新加載配置
$ netstat -tnlp|grep :80
$ netstat -tnlp|grep :8088
# 重啟服務,不能使用gitlab-ctl reconfigure,要不然會重置配置回80
$ gitlab-ctl restart
$ netstat -tnlp|grep :8088
web訪問:http://192.168.0.113:8088/

3、修改giltab-shell配置
上面nginx埠改了,giltab-shell配置也必須跟著改,要不然提交會報錯,組態檔:
/var/opt/gitlab/gitlab-shell/config.yml,修改如下:
gitlab_url: "http://127.0.0.1:8088"
重啟服務
$ gitlab-ctl restart
6)訪問驗證
http://192.168.0.113:8088

7)Gitlab各組件啟動停止命令
其實上面的restart都是重啟所有服務,很麻煩,一般在公司都是重啟指定服務,
1、GitLab(所有服務)
$ gitlab-ctl start
$ gitlab-ctl stop
$ gitlab-ctl restart
$ gitlab-ctl status
$ gitlab-ctl reconfigure
2、Nginx
$ gitlab-ctl start nginx
$ gitlab-ctl stop nginx
$ gitlab-ctl restart nginx
$ gitlab-ctl status nginx
3、Puma
$ gitlab-ctl start puma
$ gitlab-ctl stop puma
$ gitlab-ctl restart puma
$ gitlab-ctl status puma
4、Sidekiq
$ gitlab-ctl start sidekiq
$ gitlab-ctl stop sidekiq
$ gitlab-ctl restart sidekiq
$ gitlab-ctl status sidekiq
5、PostgreSQL
$ gitlab-ctl start postgresql
$ gitlab-ctl stop postgresql
$ gitlab-ctl restart postgresql
$ gitlab-ctl status postgresql
6、Redis
$ gitlab-ctl start redis
$ gitlab-ctl stop redis
$ gitlab-ctl restart redis
$ gitlab-ctl status redis
8)簡單使用
1、新建專案


2、生成并配置秘鑰ssh密鑰--Windows(推薦)
1)打開Git Bash查看電腦上是否已經存在SSH密鑰
$ cd ~/.ssh/
2) 創建新的ssh key
$ ssh-keygen -t rsa -C "[email protected]"
3)gitlab配置ssh key
先復制~/.ssh/id_rsa.pub內容

在再gitlab上添加


3、git配置
$ git remote add gitlab_test2022 [email protected]:root/test2022.git
$ git remote -v
# 將本地倉庫的檔案push到gitlab
$ git push gitlab_test2022 master


【溫馨提示】gitlab的安裝和簡單操作使用就先到這了,基本上公司不會讓自己親自去搭建這玩意,所以只要會使用git基本操作就行了,不用去糾結其中的原理,如果想了解更多,請參考Gitlab官方檔案,
希望這篇文章對小伙伴有所幫助~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/473461.html
標籤:其他
上一篇:leveldb實作之寫入流程
