日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

git 从入门到精通

發布時間:2025/3/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 git 从入门到精通 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

?

?

工程化專題之Git

?

Git 是一個開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目。

Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。

Git 與常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本庫的方式,不必服務器端軟件支持。

?

Git 與 SVN 區別

Git 不僅僅是個版本控制系統,它也是個內容管理系統(CMS),工作管理系統等。

如果你是一個具有使用 SVN 背景的人,你需要做一定的思想轉換,來適應 Git 提供的一些概念和特征。

Git 與 SVN 區別點:

  • 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 哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。

    ?

?

?

在 Windows 平臺上安裝 Git 同樣輕松,有個叫做 msysGit 的項目提供了安裝包,可以到 GitHub 的頁面上下載 exe 安裝文件并運行:

安裝包下載地址:https://gitforwindows.org/

?

完成安裝之后,就可以使用命令行的 git 工具(已經自帶了 ssh 客戶端)了,另外還有一個圖形界面的 Git 項目管理工具。

在開始菜單里找到"Git"->"Git Bash",會彈出 Git 命令窗口,你可以在該窗口進行 Git 操作。

?

安裝

$ git config --global user.name "zz" $ git config --global user.email zz@email.com

?

查看配置信息

要檢查已有的配置信息,可以使用 git config --list 命令:

$ git config --list http.postbuffer=2M user.name=zz user.email=zz@email.com

有時候會看到重復的變量名,那就說明它們來自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不過最終 Git 實際采用的是最后一個。

這些配置我們也可以在 ~/.gitconfig/etc/gitconfig 看到,如下所示:

vim ~/.gitconfig

顯示內容如下所示:

[http]postBuffer = 2M [user]name = zzemail = zz@email.com

也可以直接查閱某個環境變量的設定,只要把特定的名字跟在后面即可,像這樣:

$ git config user.name zz

?

?

Git 工作流程

一般工作流程如下:

  • 克隆 Git 資源作為工作目錄。
  • 在克隆的資源上添加或修改文件。
  • 如果其他人修改了,你可以更新資源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果發現錯誤,可以撤回提交并再次修改并提交。

下圖展示了 Git 的工作流程:

?

Git 工作區、暫存區和版本庫

基本概念

我們先來理解下Git 工作區、暫存區和版本庫概念

  • 工作區:就是你在電腦里能看到的目錄。
  • 暫存區:英文叫stage, 或index。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
  • 版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

下面這個圖展示了工作區、版本庫中的暫存區和版本庫之間的關系:

圖中左側為工作區,右側為版本庫。在版本庫中標記為 "index" 的區域是暫存區(stage, index),標記為 "master" 的是 master 分支所代表的目錄樹。

圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"游標"。所以圖示的命令中出現 HEAD 的地方可以用 master 來替換。

圖中的 objects 標識的區域為 Git 的對象庫,實際位于 ".git/objects" 目錄下,里面包含了創建的各種對象及內容。

當對工作區修改(或新增)的文件執行 "git add" 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。

當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。

當執行 "git reset HEAD" 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。

當執行 "git rm --cached <file>" 命令時,會直接從暫存區刪除文件,工作區則不做出改變。

當執行 "git checkout ." 或者 "git checkout -- <file>" 命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。

當執行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

?

Git 創建倉庫

你可以使用一個已經存在的目錄作為Git倉庫。


git init

Git 使用 git init 命令來初始化一個 Git 倉庫,Git 的很多命令都需要在 Git 的倉庫中運行,所以 git init 是使用 Git 的第一個命令。

在執行完成 git init 命令后,Git 倉庫會生成一個 .git 目錄,該目錄包含了資源的所有元數據,其他的項目目錄保持不變(不像 SVN 會在每個子目錄生成 .svn 目錄,Git 只在倉庫的根目錄生成 .git 目錄)。

使用方法

使用當前目錄作為Git倉庫,我們只需使它初始化。

git init

該命令執行完后會在當前目錄生成一個 .git 目錄。

使用我們指定目錄作為Git倉庫。

git init newrepo

初始化后,會在 newrepo 目錄下會出現一個名為 .git 的目錄,所有 Git 需要的數據和資源都存放在這個目錄中。

如果當前目錄下有幾個文件想要納入版本控制,需要先用 git add 命令告訴 Git 開始對這些文件進行跟蹤,然后提交:

$ git add *.c $ git add README $ git commit -m '初始化項目版本'

以上命令將目錄下以 .c 結尾及 README 文件提交到倉庫中。


git clone

我們使用 git clone 從現有 Git 倉庫中拷貝項目(類似 svn checkout)。

克隆倉庫的命令格式為:

git clone <repo>

如果我們需要克隆到指定的目錄,可以使用以下命令格式:

git clone <repo> <directory>

參數說明:

  • repo:Git 倉庫。
  • directory:本地目錄。

比如,要克隆 Ruby 語言的 Git 代碼倉庫 Grit,可以用下面的命令:

$ git clone git://github.com/schacon/grit.git

執行該命令后,會在當前目錄下創建一個名為grit的目錄,其中包含一個 .git 的目錄,用于保存下載下來的所有版本記錄。

如果要自己定義要新建的項目目錄名稱,可以在上面的命令末尾指定新的名字:

?

$ git clone git://github.com/schacon/grit.git mygrit

?

Git 基本操作

Git 的工作就是創建和保存你項目的快照及與之后的快照進行對比。本章將對有關創建與提交你的項目快照的命令作介紹。


獲取與創建項目命令

git init

用 git init 在目錄中創建新的 Git 倉庫。 你可以在任何時候、任何目錄中這么做,完全是本地化的。

在目錄中執行 git init,就可以創建一個 Git 倉庫了。比如我們創建 runoob 項目:

$ mkdir runoob $ cd runoob/ $ git init Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/ # 在 /www/runoob/.git/ 目錄初始化空 Git 倉庫完畢。

現在你可以看到在你的項目中生成了 .git 這個子目錄。 這就是你的 Git 倉庫了,所有有關你的此項目的快照數據都存放在這里。

ls -a .????..????.git

git clone

使用 git clone 拷貝一個 Git 倉庫到本地,讓自己能夠查看該項目,或者進行修改。

如果你需要與他人合作一個項目,或者想要復制一個項目,看看代碼,你就可以克隆那個項目。 執行命令:

git clone [url]

[url] 為你想要復制的項目,就可以了。

例如我們克隆 Github 上的項目:

$ git clone git@github.com:schacon/simplegit.git Cloning into 'simplegit'... remote: Counting objects: 13, done. remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 13 Receiving objects: 100% (13/13), done. Resolving deltas: 100% (2/2), done. Checking connectivity... done.

克隆完成后,在當前目錄下會生成一個 simplegit 目錄:

$ cd simplegit/ $ ls README Rakefile lib

上述操作將復制該項目的全部記錄。

$ ls -a . .. .git README Rakefile lib $ cd .git $ ls HEAD description info packed-refs branches hooks logs refs config index objects

默認情況下,Git 會按照你提供的 URL 所指示的項目的名稱創建你的本地項目目錄。 通常就是該 URL 最后一個 / 之后的項目名稱。如果你想要一個不一樣的名字, 你可以在該命令后加上你想要的名稱。


基本快照

Git 的工作就是創建和保存你的項目的快照及與之后的快照進行對比。本章將對有關創建與提交你的項目的快照的命令作介紹。

git add

git add 命令可將該文件添加到緩存,如我們添加以下兩個文件:

$ touch README $ touch hello.php $ ls README????????hello.php $ git status -s ?? README ?? hello.php $

git status 命令用于查看項目的當前狀態。

接下來我們執行 git add 命令來添加文件:

$ git add README hello.php

現在我們再執行 git status,就可以看到這兩個文件已經加上去了。

$ git status -s A README A hello.php $

新項目中,添加所有文件很普遍,我們可以使用 git add . 命令來添加當前項目的所有文件。

現在我們修改 README 文件:

$ vim README

在 README 添加以下內容:# Runoob Git 測試,然后保存退出。

再執行一下 git status:

$ git status -s AM README A hello.php

"AM" 狀態的意思是,這個文件在我們將它添加到緩存之后又有改動。改動后我們再執行 git add 命令將其添加到緩存中:

$ git add . $ git status -s A README A hello.php

當你要將你的修改包含在即將提交的快照里的時候,需要執行 git add。

git status

git status 以查看在你上次提交之后是否有修改。

我演示該命令的時候加了 -s 參數,以獲得簡短的結果輸出。如果沒加該參數會詳細輸出內容:

$ git status On branch masterInitial commitChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: READMEnew file: hello.php

git diff

執行 git diff 來查看執行 git status 的結果的詳細信息。

git diff 命令顯示已寫入緩存與已修改但尚未寫入緩存的改動的區別。git diff 有兩個主要的應用場景。

  • 尚未緩存的改動:git diff
  • 查看已緩存的改動: git diff --cached
  • 查看已緩存的與未緩存的所有改動:git diff HEAD
  • 顯示摘要而非整個 diff:git diff --stat

在 hello.php 文件中輸入以下內容:

<?php echo '菜鳥教程:www.runoob.com'; ?> $ git status -s A README AM hello.php $ git diff diff --git a/hello.php b/hello.php index e69de29..69b5711 100644 --- a/hello.php +++ b/hello.php @@ -0,0 +1,3 @@ +<?php +echo '菜鳥教程:www.runoob.com'; +?>

git status 顯示你上次提交更新后的更改或者寫入緩存的改動, 而 git diff 一行一行地顯示這些改動具體是啥。

接下來我們來查看下 git diff --cached 的執行效果:

$ git add hello.php $ git status -s A README A hello.php $ git diff --cached diff --git a/README b/README new file mode 100644 index 0000000..8f87495 --- /dev/null +++ b/README @@ -0,0 +1 @@ +# Runoob Git 測試 diff --git a/hello.php b/hello.php new file mode 100644 index 0000000..69b5711 --- /dev/null +++ b/hello.php @@ -0,0 +1,3 @@ +<?php +echo '菜鳥教程:www.runoob.com'; +?>

git commit

使用 git add 命令將想要快照的內容寫入緩存區, 而執行 git commit 將緩存區內容添加到倉庫中。

Git 為你的每一個提交都記錄你的名字與電子郵箱地址,所以第一步需要配置用戶名和郵箱地址。

$ git config --global user.name 'runoob' $ git config --global user.email test@runoob.com

接下來我們寫入緩存,并提交對 hello.php 的所有改動。在首個例子中,我們使用 -m 選項以在命令行中提供提交注釋。

$ git add hello.php $ git status -s A README A hello.php $ git commit -m '第一次版本提交' [master (root-commit) d32cf1f] 第一次版本提交2 files changed, 4 insertions(+)create mode 100644 READMEcreate mode 100644 hello.php

現在我們已經記錄了快照。如果我們再執行 git status:

$ git status # On branch master nothing to commit (working directory clean)

以上輸出說明我們在最近一次提交之后,沒有做任何改動,是一個"working directory clean:干凈的工作目錄"。

如果你沒有設置 -m 選項,Git 會嘗試為你打開一個編輯器以填寫提交信息。 如果 Git 在你對它的配置中找不到相關信息,默認會打開 vim。屏幕會像這樣:

# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: hello.php # ~ ~ ".git/COMMIT_EDITMSG" 9L, 257C

如果你覺得 git add 提交緩存的流程太過繁瑣,Git 也允許你用 -a 選項跳過這一步。命令格式如下:

git commit -a

我們先修改 hello.php 文件為以下內容:

<?php echo '菜鳥教程:www.runoob.com'; echo '菜鳥教程:www.runoob.com'; ?>

再執行以下命令:

git commit -am '修改 hello.php 文件' [master 71ee2cb] 修改 hello.php 文件1 file changed, 1 insertion(+)

git reset HEAD

git reset HEAD 命令用于取消已緩存的內容。

我們先改動文件 README 文件,內容如下:

# Runoob Git 測試 # 菜鳥教程

hello.php 文件修改為:

<?php echo '菜鳥教程:www.runoob.com'; echo '菜鳥教程:www.runoob.com'; echo '菜鳥教程:www.runoob.com'; ?>

現在兩個文件修改后,都提交到了緩存區,我們現在要取消其中一個的緩存,操作如下:

$ git status -sM READMEM hello.php $ git add . $ git status -s M README M hello.php $ git reset HEAD hello.php Unstaged changes after reset: M????hello.php $ git status -s M READMEM hello.php

現在你執行 git commit,只會將 README 文件的改動提交,而 hello.php 是沒有的。

$ git commit -m '修改' [master f50cfda] 修改1 file changed, 1 insertion(+) $ git status -sM hello.php

可以看到 hello.php 文件的修改并未提交。

這時我們可以使用以下命令將 hello.php 的修改提交:

$ git commit -am '修改 hello.php 文件' [master 760f74d] 修改 hello.php 文件1 file changed, 1 insertion(+) $ git status On branch master nothing to commit, working directory clean

簡而言之,執行 git reset HEAD 以取消之前 git add 添加,但不希望包含在下一提交快照中的緩存。

git rm

如果只是簡單地從工作目錄中手工刪除文件,運行 git status 時就會在 Changes not staged for commit 的提示。

要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除,然后提交。可以用以下命令完成此項工作

git rm <file>

如果刪除之前修改過并且已經放到暫存區域的話,則必須要用強制刪除選項 -f

git rm -f <file>

如果把文件從暫存區域移除,但仍然希望保留在當前工作目錄中,換句話說,僅是從跟蹤清單中刪除,使用 --cached 選項即可

git rm --cached <file>

如我們刪除 hello.php文件:

$ git rm hello.php rm 'hello.php' $ ls README

不從工作區中刪除文件:

$ git rm --cached README rm 'README' $ ls README

可以遞歸刪除,即如果后面跟的是一個目錄做為參數,則會遞歸刪除整個目錄中的所有子目錄和文件:

git rm –r *

進入某個目錄中,執行此語句,會刪除該目錄下的所有文件和子目錄。

git mv

git mv 命令用于移動或重命名一個文件、目錄、軟連接。

我們先把剛移除的 README 添加回來:

$ git add README

然后對其重名:

$ git mv README README.md $ ls README.md

?

?

Git 分支管理

?

幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味著你可以從開發主線上分離開來,然后在不影響主線的同時繼續工作。

有人把 Git 的分支模型稱為必殺技特性,而正是因為它,將 Git 從版本控制系統家族里區分出來。

創建分支命令:

git branch (branchname)

切換分支命令:

git checkout (branchname)

當你切換分支的時候,Git 會用該分支的最后提交的快照替換你的工作目錄的內容, 所以多個分支不需要多個目錄。

合并分支命令:

git merge

你可以多次合并到統一分支, 也可以選擇在合并之后直接刪除被并入的分支。

開始前我們先創建一個測試目錄:

$ mkdir gitdemo $ cd gitdemo/ $ git init Initialized empty Git repository... $ touch README $ git add README $ git commit -m '第一次版本提交' [master (root-commit) 3b58100] 第一次版本提交1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 README

Git 分支管理

列出分支

列出分支基本命令:

git branch

沒有參數時,git branch 會列出你在本地的分支。

$ git branch * master

此例的意思就是,我們有一個叫做 master 的分支,并且該分支是當前分支。

當你執行 git init 的時候,缺省情況下 Git 就會為你創建 master 分支。

如果我們要手動創建一個分支。執行 git branch (branchname) 即可。

$ git branch testing $ git branch * mastertesting

現在我們可以看到,有了一個新分支 testing

當你以此方式在上次提交更新之后創建了新分支,如果后來又有更新提交, 然后又切換到了 testing 分支,Git 將還原你的工作目錄到你創建分支時候的樣子。

接下來我們將演示如何切換分支,我們用 git checkout (branch) 切換到我們要修改的分支。

$ ls README $ echo 'runoob.com' > test.txt $ git add . $ git commit -m 'add test.txt' [master 3e92c19] add test.txt1 file changed, 1 insertion(+)create mode 100644 test.txt $ ls README????????test.txt $ git checkout testing Switched to branch 'testing' $ ls README

當我們切換到 testing 分支的時候,我們添加的新文件 test.txt 被移除了。切換回 master 分支的時候,它們有重新出現了。

$ git checkout master Switched to branch 'master' $ ls README????????test.txt

我們也可以使用 git checkout -b (branchname) 命令來創建新分支并立即切換到該分支下,從而在該分支中操作。

$ git checkout -b newtest Switched to a new branch 'newtest' $ git rm test.txt rm 'test.txt' $ ls README $ touch hello.php $ git add . $ git commit -am 'removed test.txt、add runoob.php' [newtest c1501a2] removed test.txt、add runoob.php2 files changed, 1 deletion(-)create mode 100644 runoob.phpdelete mode 100644 test.txt $ ls README????????runoob.php $ git checkout master Switched to branch 'master' $ ls README????????test.txt

如你所見,我們創建了一個分支,在該分支的上移除了一些文件 test.txt,并添加了 runoob.php 文件,然后切換回我們的主分支,刪除的 test.txt 文件又回來了,且新增加的 runoob.php 不存在主分支中。

使用分支將工作切分開來,從而讓我們能夠在不同開發環境中做事,并來回切換。

刪除分支

刪除分支命令:

git branch -d (branchname)

例如我們要刪除 testing 分支:

$ git branch * mastertesting $ git branch -d testing Deleted branch testing (was 85fc7e7). $ git branch * master

分支合并

一旦某分支有了獨立內容,你終究會希望將它合并回到你的主分支。 你可以使用以下命令將任何分支合并到當前分支中去:

git merge $ git branch * masternewtest $ ls README????????test.txt $ git merge newtest Updating 3e92c19..c1501a2 Fast-forwardrunoob.php | 0test.txt | 1 -2 files changed, 1 deletion(-)create mode 100644 runoob.phpdelete mode 100644 test.txt $ ls README????????runoob.php

以上實例中我們將 newtest 分支合并到主分支去,test.txt 文件被刪除。

合并完后就可以刪除分支:

$ git branch -d newtest Deleted branch newtest (was c1501a2).

刪除后, 就只剩下 master 分支了:

$ git branch * master

合并沖突

合并并不僅僅是簡單的文件添加、移除的操作,Git 也會合并修改。

$ git branch * master $ cat runoob.php

首先,我們創建一個叫做 change_site 的分支,切換過去,我們將 runoob.php 內容改為:

<?php echo 'runoob'; ?>

創建 change_site 分支:

$ git checkout -b change_site Switched to a new branch 'change_site' $ vim runoob.php $ head -3 runoob.php <?php echo 'runoob'; ?> $ git commit -am 'changed the runoob.php' [change_site 7774248] changed the runoob.php1 file changed, 3 insertions(+)

將修改的內容提交到 change_site 分支中。 現在,假如切換回 master 分支我們可以看內容恢復到我們修改前的(空文件,沒有代碼),我們再次修改 runoob.php 文件。

$ git checkout master Switched to branch 'master' $ cat runoob.php $ vim runoob.php # 修改內容如下 $ cat runoob.php <?php echo 1; ?> $ git diff diff --git a/runoob.php b/runoob.php index e69de29..ac60739 100644 --- a/runoob.php +++ b/runoob.php @@ -0,0 +1,3 @@ +<?php +echo 1; +?> $ git commit -am '修改代碼' [master c68142b] 修改代碼1 file changed, 3 insertions(+)

現在這些改變已經記錄到我的 "master" 分支了。接下來我們將 "change_site" 分支合并過來。

$ git merge change_site Auto-merging runoob.php CONFLICT (content): Merge conflict in runoob.php Automatic merge failed; fix conflicts and then commit the result.$ cat runoob.php # 代開文件,看到沖突內容 <?php <<<<<<< HEAD echo 1; ======= echo 'runoob'; >>>>>>> change_site ?>

我們將前一個分支合并到 master 分支,一個合并沖突就出現了,接下來我們需要手動去修改它。

$ vim runoob.php $ cat runoob.php <?php echo 1; echo 'runoob'; ?> $ git diff diff --cc runoob.php index ac60739,b63d7d7..0000000 --- a/runoob.php +++ b/runoob.php @@@ -1,3 -1,3 +1,4 @@@<?php+echo 1; + echo 'runoob';?>

在 Git 中,我們可以用 git add 要告訴 Git 文件沖突已經解決

$ git status -s UU runoob.php $ git add runoob.php $ git status -s M runoob.php $ git commit [master 88afe0e] Merge branch 'change_site'

現在我們成功解決了合并中的沖突,并提交了結果。

?

Git 查看提交歷史

在使用 Git 提交了若干更新之后,又或者克隆了某個項目,想回顧下提交歷史,我們可以使用 git log 命令查看。

針對我們前一章節的操作,使用 git log 命令列出歷史提交記錄如下:

$ git log commit d5e9fc2c811e0ca2b2d28506ef7dc14171a207d9 (HEAD -> master) Merge: c68142b 7774248 Author: runoob <test@runoob.com> Date: Fri May 3 15:55:58 2019 +0800Merge branch 'change_site'commit c68142b562c260c3071754623b08e2657b4c6d5b Author: runoob <test@runoob.com> Date: Fri May 3 15:52:12 2019 +0800修改代碼commit 777424832e714cf65d3be79b50a4717aea51ab69 (change_site) Author: runoob <test@runoob.com> Date: Fri May 3 15:49:26 2019 +0800changed the runoob.phpcommit c1501a244676ff55e7cccac1ecac0e18cbf6cb00 Author: runoob <test@runoob.com> Date: Fri May 3 15:35:32 2019 +0800

我們可以用 --oneline 選項來查看歷史記錄的簡潔的版本。

$ git log --oneline $ git log --oneline d5e9fc2 (HEAD -> master) Merge branch 'change_site' c68142b 修改代碼 7774248 (change_site) changed the runoob.php c1501a2 removed test.txt、add runoob.php 3e92c19 add test.txt 3b58100 第一次版本提交

這告訴我們的是,此項目的開發歷史。

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

* d5e9fc2 (HEAD -> master) Merge branch 'change_site' |\ | * 7774248 (change_site) changed the runoob.php * | c68142b 修改代碼 |/ * c1501a2 removed test.txt、add runoob.php * 3e92c19 add test.txt * 3b58100 第一次版本提交

現在我們可以更清楚明了地看到何時工作分叉、又何時歸并。

你也可以用 --reverse 參數來逆向顯示所有日志。

$ git log --reverse --oneline 3b58100 第一次版本提交 3e92c19 add test.txt c1501a2 removed test.txt、add runoob.php 7774248 (change_site) changed the runoob.php c68142b 修改代碼 d5e9fc2 (HEAD -> master) Merge branch 'change_site'

如果只想查找指定用戶的提交日志可以使用命令:git log --author , 例如,比方說我們要找 Git 源碼中 Linus 提交的部分:

$ git log --author=Linus --oneline -5 81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory 3bb7256 make "index-pack" a built-in 377d027 make "git pack-redundant" a built-in b532581 make "git unpack-file" a built-in 112dd51 make "mktag" a built-in

如果你要指定日期,可以執行幾個選項:--since 和 --before,但是你也可以用 --until 和 --after。

例如,如果我要看 Git 項目中三周前且在四月十八日之后的所有提交,我可以執行這個(我還用了 --no-merges 選項以隱藏合并提交):

$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges 5469e2d Git 1.7.1-rc2 d43427d Documentation/remote-helpers: Fix typos and improve language 272a36b Fixup: Second argument may be any arbitrary string b6c8d2d Documentation/remote-helpers: Add invocation section 5ce4f4e Documentation/urls: Rewrite to accomodate transport::address 00b84e9 Documentation/remote-helpers: Rewrite description 03aa87e Documentation: Describe other situations where -z affects git diff 77bc694 rebase-interactive: silence warning when no commits rewritten 636db2c t3301: add tests to use --format="%N"

?

Git 標簽

如果你達到一個重要的階段,并希望永遠記住那個特別的提交快照,你可以使用 git tag 給它打上標簽。

比如說,我們想為我們的 runoob 項目發布一個"1.0"版本。 我們可以用 git tag -a v1.0 命令給最新一次提交打上(HEAD)"v1.0"的標簽。

-a 選項意為"創建一個帶注解的標簽"。 不用 -a 選項也可以執行的,但它不會記錄這標簽是啥時候打的,誰打的,也不會讓你添加個標簽的注解。 我推薦一直創建帶注解的標簽。

$ git tag -a v1.0

當你執行 git tag -a 命令時,Git 會打開你的編輯器,讓你寫一句標簽注解,就像你給提交寫注解一樣。

現在,注意當我們執行 git log --decorate 時,我們可以看到我們的標簽了:

* d5e9fc2 (HEAD -> master) Merge branch 'change_site' |\ | * 7774248 (change_site) changed the runoob.php * | c68142b 修改代碼 |/ * c1501a2 removed test.txt、add runoob.php * 3e92c19 add test.txt * 3b58100 第一次版本提交

如果我們忘了給某個提交打標簽,又將它發布了,我們可以給它追加標簽。

例如,假設我們發布了提交 85fc7e7(上面實例最后一行),但是那時候忘了給它打標簽。 我們現在也可以:

$ git tag -a v0.9 85fc7e7 $ git log --oneline --decorate --graph * d5e9fc2 (HEAD -> master) Merge branch 'change_site' |\ | * 7774248 (change_site) changed the runoob.php * | c68142b 修改代碼 |/ * c1501a2 removed test.txt、add runoob.php * 3e92c19 add test.txt * 3b58100 (tag: v0.9) 第一次版本提交

如果我們要查看所有標簽可以使用以下命令:

$ git tag v0.9 v1.0

指定標簽信息命令:

git tag -a <tagname> -m "runoob.com標簽"

PGP簽名標簽命令:

git tag -s <tagname> -m "runoob.com標簽"

?

Git 遠程倉庫(Github)

Git 并不像 SVN 那樣有個中心服務器。

目前我們使用到的 Git 命令都是在本地執行,如果你想通過 Git 分享你的代碼或者與其他開發人員合作。 你就需要將數據放到一臺其他開發人員能夠連接的服務器上。

本例使用了 Github 作為遠程倉庫,你可以先閱讀我們的 Github 簡明教程。


添加遠程庫

要添加一個新的遠程倉庫,可以指定一個簡單的名字,以便將來引用,命令格式如下:

git remote add [shortname] [url]

本例以 Github 為例作為遠程倉庫,如果你沒有 Github 可以在官網 https://github.com/注冊。

?

由于你的本地 Git 倉庫和 GitHub 倉庫之間的傳輸是通過SSH加密的,所以我們需要配置驗證信息:

使用以下命令生成 SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

后面的 your_email@youremail.com 改為你在 Github 上注冊的郵箱,之后會要求確認路徑和輸入密碼,我們這使用默認的一路回車就行。成功的話會在 ~/ 下生成 .ssh 文件夾,進去,打開 id_rsa.pub,復制里面的 key

回到 github 上,進入 Account => Settings(賬戶配置)。

左邊選擇 SSH and GPG keys,然后點擊 New SSH key 按鈕,title 設置標題,可以隨便填,粘貼在你電腦上生成的 key。

添加成功后界面如下所示

?

為了驗證是否成功,輸入以下命令:

$ ssh -T git@github.com Hi tianqixin! You've successfully authenticated, but GitHub does not provide shell access.

以下命令說明我們已成功連上 Github。

之后登錄后點擊" New repository " 如下圖所示:

之后在在Repository name 填入 runoob-git-test(遠程倉庫名) ,其他保持默認設置,點擊"Create repository"按鈕,就成功地創建了一個新的Git倉庫:

創建成功后,顯示如下信息:

以上信息告訴我們可以從這個倉庫克隆出新的倉庫,也可以把本地倉庫的內容推送到GitHub倉庫。

現在,我們根據 GitHub 的提示,在本地的倉庫下運行命令:

$ mkdir runoob-git-test # 創建測試目錄 $ cd runoob-git-test/ # 進入測試目錄 $ echo "# 菜鳥教程 Git 測試" >> README.md # 創建 README.md 文件并寫入內容 $ ls # 查看目錄下的文件 README $ git init # 初始化 $ git add README.md # 添加文件 $ git commit -m "添加 README.md 文件" # 提交并備注信息 [master (root-commit) 0205aab] 添加 README.md 文件1 file changed, 1 insertion(+)create mode 100644 README.md# 提交到 Github $ git remote add origin git@github.com:tianqixin/runoob-git-test.git $ git push -u origin master

以下命令請根據你在Github成功創建新倉庫的地方復制,而不是根據我提供的命令,因為我們的Github用戶名不一樣,倉庫名也不一樣。

接下來我們返回 Github 創建的倉庫,就可以看到文件已上傳到 Github上:


查看當前的遠程庫

要查看當前配置有哪些遠程倉庫,可以用命令:

git remote

實例

$ git remote origin $ git remote -v origin????git@github.com:tianqixin/runoob-git-test.git (fetch) origin????git@github.com:tianqixin/runoob-git-test.git (push)

執行時加上 -v 參數,你還可以看到每個別名的實際鏈接地址。


提取遠程倉庫

Git 有兩個命令用來提取遠程倉庫的更新。

1、從遠程倉庫下載新分支與數據:

git fetch

該命令執行完后需要執行git merge 遠程分支到你所在的分支。

2、從遠端倉庫提取數據并嘗試合并到當前分支:

git merge

該命令就是在執行 git fetch 之后緊接著執行 git merge 遠程分支到你所在的任意分支。

假設你配置好了一個遠程倉庫,并且你想要提取更新的數據,你可以首先執行 git fetch [alias] 告訴 Git 去獲取它有你沒有的數據,然后你可以執行 git merge [alias]/[branch] 以將服務器上的任何更新(假設有人這時候推送到服務器了)合并到你的當前分支。

接下來我們在 Github 上點擊" README.md" 并在線修改它:

然后我們在本地更新修改。

$ git fetch origin remote: Counting objects: 3, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), done. From github.com:tianqixin/runoob-git-test0205aab..febd8ed master -> origin/master

以上信息"0205aab..febd8ed master -> origin/master" 說明 master 分支已被更新,我們可以使用以下命令將更新同步到本地:

$ git merge origin/master Updating 0205aab..febd8ed Fast-forwardREADME.md | 1 +1 file changed, 1 insertion(+)

查看 README.md 文件內容:

$ cat README.md # 菜鳥教程 Git 測試 ## 第一次修改內容

推送到遠程倉庫

推送你的新分支與數據到某個遠端倉庫命令:

git push [alias] [branch]

以上命令將你的 [branch] 分支推送成為 [alias] 遠程倉庫上的 [branch] 分支,實例如下。

$ touch runoob-test.txt # 添加文件 $ git add runoob-test.txt $ git commit -m "添加到遠程" master 69e702d] 添加到遠程1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 runoob-test.txt$ git push origin master # 推送到 Github

重新回到我們的 Github 倉庫,可以看到文件以及提交上來了:


刪除遠程倉庫

刪除遠程倉庫你可以使用命令:

git remote rm [別名]

實例

$ git remote -v origin????git@github.com:tianqixin/runoob-git-test.git (fetch) origin????git@github.com:tianqixin/runoob-git-test.git (push)# 添加倉庫 origin2 $ git remote add origin2 git@github.com:tianqixin/runoob-git-test.git$ git remote -v origin????git@github.com:tianqixin/runoob-git-test.git (fetch) origin????git@github.com:tianqixin/runoob-git-test.git (push) origin2????git@github.com:tianqixin/runoob-git-test.git (fetch) origin2????git@github.com:tianqixin/runoob-git-test.git (push)# 刪除倉庫 origin2 $ git remote rm origin2 $ git remote -v origin????git@github.com:tianqixin/runoob-git-test.git (fetch) origin????git@github.com:tianqixin/runoob-git-test.git (push)

使用 CODING 倉庫

對于開發者而言 GitHub 已經不陌生了,在平時的開發中將代碼托管到 GitHub 上十分方便。但是、國內用戶通常會遇到一個問題就是: GitHub 的訪問速度太慢。在阿里云和騰訊云的主機上 clone 代碼時,如果主機的帶寬不夠大,clone 代碼簡直就是龜速。常常還會出現:丟包、失去連接等情況。對于這種情況,如果你想體驗飛速的 Git 服務,不妨試著用一下 騰訊云開發者平臺。相對于GitHub,CODING 除了提供免費的 Git 倉庫之外,還給我們提供了免費的私有倉庫(免費的普通會員提供 10 個私有項目、512M Git 倉庫容量)。此外、CODING 還為我們免費提供了,項目管理、任務管理、團隊管理、文件管理等功能,十分強大。

下面,我是試著來創建一個 CODING 項目,并且將 GitHub 上的代碼遷移到 CODING。通常,分為三步:

  • 1、創建 CODING 項目
  • 2、將 GitHub 代碼 Pull 到本地
  • 3、本地關聯 CODING 倉庫,Push 代碼到 CODING

創建 CODING 項目:

登錄 騰訊云開發者平臺 注冊賬號,然后在項目管理頁面中創建項目,這一步不做贅述,按你的需要填寫項目名稱與描述,選擇 License 類型即可,關于 License 的選擇可以參考這篇文章:如何選擇開源許可證?。項目創建完成中,在右側菜單欄中的代碼選項卡可以對代碼進行相關的管理與操作

將 GitHub 代碼 Pull 到本地:

登錄 GitHub 選擇你想要導入的倉庫并復制倉庫地址,在本地執行命令,將 GitHub 倉庫代碼拉下來:

sudo git clone

本地關聯 CODING 倉庫,Push 代碼到 CODING:

首先我們執行命令:git remote -v

可以看到,當前的 git 已經關聯了一個遠程倉庫。

因此,接下來我們執行以下命令,來關聯 CODING 遠程倉庫(后面的倉庫地址需要替換為你的 CODING 項目的地址!) 第一條命令的作用是刪除現有的倉庫關聯,后面兩條命令則是將倉庫關聯到 CODING 的地址,并且將代碼 Push 到 master 分支

sudo git remote rm origin sudo git remote add origin https://git.coding.net/xxx/xxx.git sudo git push -u origin master

之后,我們再次進入 CODING 項目中代碼管理的頁面,便可以看到我們剛才 Push 上去的代碼了。至此、GitHub 上的項目已經完整遷移到了 CODING 平臺!

CODING 倉庫的免密碼 Push/Pull

代碼遷移到 CODING 之后,我們發現,每次 Push/Pull 代碼的時候都會提示我們輸入用戶名和密碼。這是因為,我們的項目還沒有添加 SSH Key,只能通過用戶名/密碼驗證。 而 CODING 是為我們提供了公鑰驗證的方式的,進入項目管理,在左側選項卡中點擊"公鑰部署"按鈕,然后點擊右側的"新建公鑰部署"

我們將本地的公鑰內容粘貼到對應位置,并且給公鑰命名一下(查看/生成本機公鑰,可以參考這篇博文:查看本機 ssh 公鑰,生成公鑰)。勾選"授予推送權限"則可以授予這臺機器Push代碼的權限。

保存好設置后,我們再次嘗試。此時,Push/Pull 代碼不在需要驗證用戶名密碼。至此,我們的代碼便完全托管在了 CODING 平臺上,享受他的便捷與飛速吧!

如有疑問請查閱幫助文檔

現在 CODING 正在舉辦一場基于 Cloud Studio 工作空間的【我最喜愛的 Cloud Studio 插件評選大賽】。進入活動官網:https://studio.qcloud.coding.net/campaign/favorite-plugins/index,了解更多活動信息。

?

?

Git 服務器搭建

Git 服務器搭建

上一章節中我們遠程倉庫使用了 Github,Github 公開的項目是免費的,但是如果你不想讓其他人看到你的項目就需要收費。

這時我們就需要自己搭建一臺Git服務器作為私有倉庫使用。

接下來我們將以 Centos 為例搭建 Git 服務器。

1、安裝Git

$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum install git

接下來我們 創建一個git用戶組和用戶,用來運行git服務:

$ groupadd git $ useradd git -g git

2、創建證書登錄

收集所有需要登錄的用戶的公鑰,公鑰位于id_rsa.pub文件中,把我們的公鑰導入到/home/git/.ssh/authorized_keys文件里,一行一個。

如果沒有該文件創建它:

$ cd /home/git/ $ mkdir .ssh $ chmod 755 .ssh $ touch .ssh/authorized_keys $ chmod 644 .ssh/authorized_keys

?

3、初始化Git倉庫

首先我們選定一個目錄作為Git倉庫,假定是/home/gitrepo/runoob.git,在/home/gitrepo目錄下輸入命令:

$ cd /home $ mkdir gitrepo $ chown git:git gitrepo/ $ cd gitrepo$ git init --bare runoob.git Initialized empty Git repository in /home/gitrepo/runoob.git/

以上命令Git創建一個空倉庫,服務器上的Git倉庫通常都以.git結尾。然后,把倉庫所屬用戶改為git:

$ chown -R git:git runoob.git

4、克隆倉庫

$ git clone git@192.168.45.4:/home/gitrepo/runoob.git Cloning into 'runoob'... warning: You appear to have cloned an empty repository. Checking connectivity... done.

192.168.45.4 為 Git 所在服務器 ip ,你需要將其修改為你自己的 Git 服務 ip。

這樣我們的 Git 服務器安裝就完成。

?

常用命令

  • git status
  • git remote
  • git clone git@xxx.com
  • git init
  • git remote add origin git@git.oschina.net:gupaoedu_com_vip/test10.git
  • git push -u origin master
  • git pull
  • git push
  • git checkout
  • git merge
  • git rebase
  • git tag 版本

?

經常幫人配置git的私鑰,來總結一下簡單的流程真心希望對大家有所幫助。

1.本地安裝好git;

2.桌面右鍵 Git Bash Here 打開git命令行;

3.ssh-keygen -t rsa -C "nideyouxiang@xxx.com"???(全部按enter);

4.cd ~/.ssh???(如果沒有執行第三步,則不會有這個文件夾);

5.cat?id_rsa.pub?????在命令行打開這個文件,會直接輸出密鑰;

6.復制,打開github???,點自己頭像 >> settings >> SSH and GPG keys >>New SSH key?

7. titile??隨便寫。??key里????粘貼第六步的內容;完成。
?

轉載于:https://my.oschina.net/zz006/blog/3054331

總結

以上是生活随笔為你收集整理的git 从入门到精通的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。