企業應用學習-git學習

1.git的基本使用

git與svn的區別node

  1. GIT 是分佈式的,SVN 不是:這是 GIT 和其它非分佈式的版本控制系統,例如 SVN,CVS 等,最核心的區別。
  2. GIT 把內容按元數據方式存儲,而 SVN 是按文件:全部的資源控制系統都是把文件的元信息隱藏在一個相似.svn,.cvs 等的文件夾裏。
  3. GIT 分支和 SVN 的分支不一樣:分支在 SVN 中一點不特別,就是版本庫中的另外的一個目錄。
  4. GIT 沒有一個全局的版本號,而 SVN 有:目前爲止這是跟 SVN 相比 GIT 缺乏的最大的一個特徵。
  5. GIT 的內容完整性要優於 SVN:GIT 的內容存儲使用的是 SHA-1 哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時下降對版本庫的破壞。

1.1 git的安裝以及初始化

1.1.1 git的安裝

以centos爲例git

(1.)yum方式來安裝gitgithub

root@ci‐node1 ~]# yum install git –y
root@ci‐node1 ~]# git version
git version 1.8.3.1

(2.)編譯安裝算法

root@ci‐node1 ~]# yum install curl‐devel expat‐devel gettext‐devel openssl‐devel zlib‐devel gcc
perl‐ExtUtils‐MakeMaker ‐y
下載最新的源碼包
root@ci‐node1 src]# cd /usr/local/src/
root@ci‐node1 src]# wget https://www.kernel.org/pub/software/scm/git/git‐2.9.5.tar.gz
root@ci‐node1 src]# ll
total 5792 ‐rw‐r‐‐r‐‐ 1 root root 5928730 Aug 11 01:57 git‐2.9.5.tar.gz
解壓安裝:
root@ci‐node1 src]# tar xf git‐2.9.5.tar.gz
root@ci‐node1 src]# cd git‐2.9.5
root@ci‐node1 git‐2.9.5]# make prefix=/usr/local/git all
root@ci‐node1 git‐2.9.5]# make prefix=/usr/local/git install
root@ci‐node1 git‐2.9.5]# rm ‐rf /usr/bin/git
root@ci‐node1 git‐2.9.5]# ln ‐s /usr/local/git/bin/git /usr/bin/git
root@ci‐node1 git‐2.9.5]# git ‐‐version
git version 2.9.5

至此,咱們已經完成了 Git 的編譯安裝vim

1.1.2 git的配置

Git 的配置從上到下分三層 system/global/local,使用三個不一樣參數進行設置,每一個層次的配置存儲在不一樣的位置,centos

  1. ./etc/gitconfig 文件:包含了適用於系統全部用戶和全部庫的值。若是你傳遞參數選項’--system’ 給 git config,它將明確的讀和寫這個文件。
  2. .~/.gitconfig 文件 :具體到你的用戶。你能夠經過傳遞--global 選項使 Git 讀或寫這個特定的文件。
  3. .位於 git 目錄的 config 文件 (也就是 .git/config) :不管你當前在用的庫是什麼,特定指向該單一的庫。每一個級別重寫前一個級別的值。所以,在.git/config 中的值覆蓋在/etc/gitconfig 中的同一個值。

一般咱們只配置 global 級別。緩存

[root@ci‐node1~]# git config ‐‐global user.name xxxx
[root@ci‐node1 ~]# git config ‐‐global user.email xxxx@xxx.com
[root@ci‐node1 ~]# git config ‐‐list
user.name=xxxx
user.email=xxxx@xxxx.com

1.1.3 git倉庫的初始化

(1.)建倉庫網絡

[root@ci-node1 ~]# mkdir git_test
// 切換到 git_test 目錄下
[root@ci-node1 ~]# cd git_test/
[root@ci-node1 git_test]# pwd
/root/git_test
// 使用 git init 命令建立一個空倉庫// 使用 git init 命令建立一個空倉庫
[root@ci-node1 git_test]# git init
Initialized empty Git repository in /root/git_test/.git/
// 空倉庫建立完成後 gittest 文件夾下會生成一個.git 隱藏文件夾。倉庫默認包含一個主
支,即 master,默認操做都是在主分支 master 上進行的。

(2.)設置過濾文件ssh

有了倉庫,咱們即可以在 git_test 文件夾下的工做區作文件增刪修改工做了,但不少時候,咱們只在乎開發過程當中的源文件,並不須要管理自動產生的其餘臨時文件。這時候咱們便須要一個過濾文件,在這個文件中設置過濾規則,讓 Git 可以自動過濾掉那些臨時文件,這個文是.gitignore 件。curl

//在倉庫目錄下建立.gitignore 文件
[root@ci-node1 git_test]# touch .gitignore
[root@ci-node1 git_test]# vim .gitignore
[root@ci-node1 git_test]# cat .gitignore
test.txt //過濾 test.txt 文件
/test/ //過濾 test 目錄
*.txt //過濾全部以.txt 結尾的文件

經常使用的通配規則:
以斜槓「/」開頭表示目錄
以星號「*」通配多個字符
以問號「?」通配單個字符
以方括號「[]」包含單個字符的匹配列表
以歎號「!」表示不忽略(跟蹤)匹配到的文件或目錄

(3.)git的倉庫或者四種狀態

git的四個區域

  • 工做目錄:當前倉庫目錄
  • 暫存區域:緩存區域--index文件夾
  • 本地倉庫:.git文件夾
  • 遠程倉庫:github或者私有gitlab

git的四種狀態

  • Untracked:新增的文件的狀態,未受 Git 管理,記錄在工做區
  • Modified:受 Git 管理過的文件的改動狀態(包括改動內容、刪除文件),記錄在工做區
  • Staged:將記錄在工做區的文件變更狀態通知了 Git,記錄在暫存區
  • Unmodified:受 Git 管理中的文件狀態(沒有變更),記錄在本地倉庫/遠程倉庫

1.2 git的基礎命令

1.2.1 git的狀態以及上傳基本命令

1. git status -->看狀態,除了unmodified以外,其餘文件改動狀態
[root@ci-node1 git_test]# git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
# a
# b
# c
nothing added to commit but untracked files present (use "git add" to track)

2. git add -->將工做目錄內的文件提交到暫存區

3 git rm --cache --> 將緩存區文件回退到本地目錄

4.git rm -f xx -->從暫存區以及本地目錄中刪除數據

5.git commit -m  '描述'  --> 在倉庫工做區下完成了文件的增刪改操做後,提交到git本地倉庫,git會對文件管理

6. git mv xx xx.xx --> 把以前用 git add 添加的文件直接在暫存區裏從新命
名或移動到新位置
//將 a 文件更名爲 a.txt
[root@ci-node1 git_test]# git mv a a.txt
[root@ci-node1 git_test]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: a.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
# b

1.2.2git版本對比以及log操做

git版本對比以及log操做

1. git diff a -->查看a文件暫存區和本地倉庫之間的差別

2. git diff --cached a -->查看a文件本地倉庫與暫存區之間具體的區別
[root@ci-node1 git_test]# git diff --cached a.txt
diff --git a/a.txt b/a.txt
index e69de29..9daeafb 100644
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+test

3.git logo  標準查看log變動

4. git log --online  精簡查看一行展現

5.git log --online  --deorate 查看分支以及其餘

6.git log -p   完整查看

7. git reflog   查看本地歷史操做,能夠看到本地具體操做
[root@ci-node1 git_test]# git reflog
8982c79 HEAD@{0}: commit: commit b
1f5fb04 HEAD@{1}: commit (initial): commit a

8. git --checkout  撤回到以前的版本,暫存區域本地目錄之間

9. git  HEAD  暫存區與倉庫保持一致

10.git reset --hard   回退到某次commit操做
原理就是放棄工做區和 index 的改動,同時 HEAD 指針指向前一個 commit 對象。
git reset –hard HEAD ^1
//要經過 git log 查看提交日誌,也可直接指定提交編號或序號
[root@ci-node1 git_test]# git log --oneline
8982c79 commit b
1f5fb04 commit a
[root@ci-node1 git_test]# git reset --hard 8982c79

1.3 git的分支和標籤

1.3.1 git的分支

Git 中的分支,其實本質上僅僅是個指向 commit 對象的可變指針。Git 會使用 master做爲分支的默認名字。在若干次提交後,你其實已經有了一個指向最後一次提交對象的master 分支,它在每次提交的時候都會自動向前移動。

image

(1.)建立分支

git log --online --decrote     #查看當前分支的log
#經常使用咱們認爲master爲穩定版本分支,dev爲開發分支

git brance testing  #建立一個brance的分支

git brance  #查看當前全部分支,展現數據中加*爲當前所在分支

image

Git 保存着一個名爲 HEAD 的特別指針。在 Git 中,它是一個指向你正在工做中的本地分支的指針(譯註:將 HEAD 想象爲當前分支的別名。)。運行 git branch 命令,僅僅是創建了一個新的分支,但不會自動切換到這個分支中去,因此在這個例子中,咱們依然還在master 分支裏工做。

image

(2.)切換當前分支結構

要切換到其餘分支,能夠執行 git checkout 命令。咱們如今轉換到新建的 testing

[root@ci-node1 git_test]# git checkout testing
Switched to branch 'testing'
[root@ci-node1 git_test]# git branch
master
* testing

image

(3.)分支合併

在前面基礎上,在testing分支建立新的文件,而後作一次commit

提交後的結果:
image

如今 testing 分支向前移動了一格,而 master 分支仍然指向原先 git checkout 時所在的 commit 對象。

若是這個時候回到master分支對文件進行修改,就會出現如下狀況

image

如今咱們的倉庫提交歷史產生了分叉,咱們能夠在不一樣分支之間來回切換,作修改相互不影響,也能夠在適當的時機把他們合併到一塊兒。如今咱們把 testing 分支的內容合併到master 分支上。

//切換到 master 分支
[root@ci-node1 git_test]# git checkout master
Already on 'master'
[root@ci-node1 git_test]# git branch
* master
Testing
//合併 testing 分支到 master,輸入提示信息
[root@ci-node1 git_test]# git merge testing
Merge made by the 'recursive' strategy.
c | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 c
//咱們看到 testing 分支的內容已經合併到 master 分支。
[root@ci-node1 git_test]# ll
total 4
-rw-r--r-- 1 root root 5 Aug 1 00:12 a.txt
-rw-r--r-- 1 root root 0 Jul 31 22:05 b
-rw-r--r-- 1 root root 0 Aug 1 17:28 c
-rw-r--r-- 1 root root 0 Aug 1 16:54 d
//經過查看 commit 信息咱們能夠看到,testing 分支作的那次 commit 已經合併到了
master 的 commit 日誌中了,並且合併後從新生成了一次 commit。
[root@ci-node1 git_test]# git log --oneline
2c56b27 Merge branch 'testing'
286061a commit d on branch master
b3f92ea commit c on branch testing
8982c79 commit b
1f5fb04 commit a

結果以下

image

注意:有時候合併操做並不會如此順利,若是在不一樣的分支中都修改同一個文件的同一部分,Git 就沒法幹靜地把二者合併了。這時 Git 作了合併,但沒有提交,它會停下來等你解決衝突。要看看哪些文件在合併時發生衝突,咱們使用 git status 查閱

[root@ci-node1 git_test]# echo "111">>a.txt
[root@ci-node1 git_test]# git add .
[root@ci-node1 git_test]# git commit -m "modify a.txt on master"
[master 0d2d2a5] modify a.txt on master
1 file changed, 1 insertion(+)
[root@ci-node1 git_test]# git checkout testing
Switched to branch 'testing'
[root@ci-node1 git_test]# echo "222">>a.txt
[root@ci-node1 git_test]# git add .
[root@ci-node1 git_test]# git commit -m "modify a.txt on testing"
[testing 3da0eb7] modify a.txt on testing
1 file changed, 1 insertion(+)
[root@ci-node1 git_test]# cat a.txt
test
222
[root@ci-node1 git_test]# git checkout master
Switched to branch 'master'
[root@ci-node1 git_test]# cat a.txt
test
111
[root@ci-node1 git_test]# git merge testing
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
[root@ci-node1 git_test]# cat a.txt
test
<<<<<<< HEAD
111
=======
222
>>>>>>> testing
[root@ci-node1 git_test]#
//修改合併後的衝突文件 a.txt,而後再作一次 commit,即完成了本次合併。
[root@ci-node1 git_test]# cat a.txt
test
111
222
[root@ci-node1 git_test]# git add .
[root@ci-node1 git_test]# git commit -m "commit modify a.txt"
[root@ci-node1 git_test]# git log --oneline
9740430 commit modify a.txt
3da0eb7 modify a.txt on testing
0d2d2a5 modify a.txt on master
2c56b27 Merge branch 'testing'
286061a commit d on branch master
b3f92ea commit c on branch testing
8982c79 commit b
1f5fb04 commit a

(4.)分支刪除

git brach -d xxx #刪除某個分支

1.3.2 git的標籤

標籤也是版本庫的一個快照。Git 的標籤雖然是版本庫的快照,但其實它就是指向某個commit 的指針
若是你達到一個重要的階段,並但願永遠記住那個特別的提交快照,你可使用 git tag 給它打上標籤。
好比說,咱們想爲咱們的 項目發佈一個"1.0"版本。 咱們能夠用 git tag -a v1.0 命令給最新一次提交打上(HEAD)"v1.0"的標籤。-a 選項意爲"建立一個帶註解的標籤"。 不用 -a 選項也能夠執行的,但它不會記錄這標籤是啥時候打的,誰打的,也不會讓你添加個標籤的註解。

1. 建立標籤
[root@ci-node1 git_test]# git tag -a v1.0
2.查看標籤
[root@ci-node1 git_test]# git tag
v1.0
3.查看標籤
[root@ci-node1 git_test]# git show v1.0
tag v1.0
Tagger: wendong <wendong866@163.com>
Date: Wed Aug 1 19:10:23 2018 +0800
merge testing after
commit 97404309c95d7344f23bffc8f3f17480698895ae
Merge: 0d2d2a5 3da0eb7
Author: wendong <wendong866@163.com>
Date: Wed Aug 1 18:42:46 2018 +0800
commit modify a.txt
diff --cc a.txt
index 72167ef,3c4f069..732fac4
--- a/a.txt
+++ b/a.txt
@@@ -1,2 -1,2 +1,3 @@@
test
+111
+ 222
4.刪除標籤
[root@ci-node1 git_test]# git tag -d v1.0
Deleted tag 'v1.0' (was 919d2a3)

2. github的使用

github的經常使用

git remote add origin ‘xxx’  #和遠端git 進行鏈接
git push -u origin master   #將本地master分支推送到遠端
git clone xxx   #將遠端項目克隆到本地,分https模式和ssh模式,ssh模式須要上傳公鑰
git fetch  #將遠端最新版本拉倒本地倉庫
git merge origin master #將遠端與本地進行合併,若是須要將本地的代碼上傳到雲端,則須要拉雲端最新的代碼到本地,而後再將本地與雲端進行合併

3.gitlab的部署(待學習和整理)

ok

相關文章
相關標籤/搜索