Git教程学习总结(分享给热爱学习的你,团队的协作离不开你呀)
目錄
?
Git 教程
Git 安裝配置
Git 工作流程
Git 工作區、暫存區和版本庫
Git 創建倉庫
Git 基本操作
Git 分支管理
Git 查看提交歷史
git log
git blame
Git 標簽
Git 遠程倉庫(Github)
Git Gitee
Git 服務器搭建
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 哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。
Git 快速入門
Git 完整命令手冊地址:http://git-scm.com/docs
?
Git 安裝配置
在使用Git前我們需要先安裝 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平臺上運行。
Git 各平臺安裝包下載地址為:http://git-scm.com/downloads
Windows 平臺上安裝
在 Windows 平臺上安裝 Git 同樣輕松,有個叫做 msysGit 的項目提供了安裝包,可以到 GitHub 的頁面上下載 exe 安裝文件并運行:
安裝包下載地址:https://gitforwindows.org/
完成安裝之后,就可以使用命令行的 git 工具(已經自帶了 ssh 客戶端)了,另外還有一個圖形界面的 Git 項目管理工具。
在開始菜單里找到"Git"->"Git Bash",會彈出 Git 命令窗口,你可以在該窗口進行 Git 操作。
Mac 平臺上安裝
在 Mac 平臺上安裝 Git 最容易的當屬使用圖形化的 Git 安裝工具,下載地址為:
http://sourceforge.net/projects/git-osx-installer/
安裝界面如下所示:
?
Git 配置
Git 提供了一個叫做 git config 的工具,專門用來配置或讀取相應的工作環境變量。
這些環境變量,決定了 Git 在各個環節的具體工作方式和行為。這些變量可以存放在以下三個不同的地方:
- /etc/gitconfig 文件:系統中對所有用戶都普遍適用的配置。若使用 git config 時用 --system 選項,讀寫的就是這個文件。
- ~/.gitconfig 文件:用戶目錄下的配置文件只適用于該用戶。若使用 git config 時用 --global 選項,讀寫的就是這個文件。
- 當前項目的 Git 目錄中的配置文件(也就是工作目錄中的 .git/config 文件):這里的配置僅僅針對當前項目有效。每一個級別的配置都會覆蓋上層的相同配置,所以 .git/config 里的配置會覆蓋 /etc/gitconfig 中的同名變量。
在 Windows 系統上,Git 會找尋用戶主目錄下的 .gitconfig 文件。主目錄即 $HOME 變量指定的目錄,一般都是 C:\Documents and Settings\$USER。
此外,Git 還會嘗試找尋 /etc/gitconfig 文件,只不過看當初 Git 裝在什么目錄,就以此作為根目錄來定位。
用戶信息
配置個人的用戶名稱和電子郵件地址:
$ git config --global user.name "sunjiaoshou" $ git config --global user.email 1748917492@qq.com?
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 '初始化項目版本'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 config 命令。
顯示當前的 git 配置信息:
$ git config --list credential.helper=osxkeychain core.repositoryformatversion=0 core.filemode=true core.bare=false core.logallrefupdates=true core.ignorecase=true core.precomposeunicode=true?編輯 git 配置文件:
$ git config -e # 針對當前倉庫?設置提交代碼時的用戶信息:
$ git config --global user.name "runoob" $ git config --global user.email test@runoob.com?如果去掉 --global 參數只對當前倉庫有效。如果去掉 --global 參數只對當前倉庫有效。
?
Git 基本操作
Git 的工作就是創建和保存你項目的快照及與之后的快照進行對比。
我將對有關創建與提交你的項目快照的命令作介紹。
Git 常用的是以下 6 個命令:git clone、git push、git add 、git commit、git checkout、git pull,我會詳細介紹。
說明:
- workspace:工作區
- staging area:暫存區/緩存區
- local repository:或本地倉庫
- remote repository:遠程倉庫
一個簡單的操作步驟:
$ git init $ git add . $ git commit- git init - 初始化倉庫。
- git add . - 添加文件到暫存區。
- git commit - 將暫存區內容添加到倉庫中。
創建倉庫命令:
下表列出了 git 創建倉庫的命令:
提交與修改
Git 的工作就是創建和保存你的項目的快照及與之后的快照進行對比。
下表列出了有關創建與提交你的項目的快照的命令:
提交日志?
遠程操作?
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 READMEGit 分支管理?
列出分支?
列出分支基本命令:
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 'sunjiaoshou' > 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 sunjiaoshou.php $ git add . $ git commit -am 'removed test.txt、add sunjiaoshou.php' [newtest c1501a2] removed test.txt、add sunjiaoshou.php2 files changed, 1 deletion(-)create mode 100644 sunjiaoshou.phpdelete mode 100644 test.txt $ ls README sunjiaoshou.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 sunjiaoshou.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 sunjiaoshou.php首先,我們創建一個叫做 change_site 的分支,切換過去,我們將 sunjiaoshou.php 內容改為:
<?php echo 'sunjiaoshou'; ?>創建 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 sunjiaoshou.php' [change_site 7774248] changed the sunjiaoshou.php1 file changed, 3 insertions(+)?將修改的內容提交到 change_site 分支中。 現在,假如切換回 master 分支我們可以看內容恢復到我們修改前的(空文件,沒有代碼),我們再次修改 sunjiaoshou.php 文件。
$ git checkout master Switched to branch 'master' $ cat sunjiaoshou.php $ vim sunjiaoshou.php # 修改內容如下 $ cat sunjiaoshou.php <?php echo 1; ?> $ git diff diff --git a/sunjiaoshou.php b/sunjiaoshou.php index e69de29..ac60739 100644 --- a/sunjiaoshou.php +++ b/sunjiaoshou.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 sunjiaoshou.php Automatic merge failed; fix conflicts and then commit the result.$ cat sunjiaoshou.php # 代開文件,看到沖突內容 <?php <<<<<<< HEAD echo 1; ======= echo 'sunjiaoshou'; >>>>>>> change_site ?>我們將前一個分支合并到 master 分支,一個合并沖突就出現了,接下來我們需要手動去修改它。
$ vim sunjiaoshou.php $ cat sunjiaoshou.php <?php echo 1; echo 'sunjiaoshou'; ?> $ git diff diff --cc sunjiaoshou.php index ac60739,b63d7d7..0000000 --- a/sunjiaoshou.php +++ b/sunjiaoshou.php @@@ -1,3 -1,3 +1,4 @@@<?php+echo 1; + echo 'sunjiaoshou';?>?在 Git 中,我們可以用 git add 要告訴 Git 文件沖突已經解決
$ git status -s UU sunjiaoshou.php $ git add sunjiaoshou.php $ git status -s M sunjiaoshou.php $ git commit [master 88afe0e] Merge branch 'change_site'現在我們成功解決了合并中的沖突,并提交了結果。?
?
Git 查看提交歷史
Git 提交歷史一般常用兩個命令:
git log
在使用 Git 提交了若干更新之后,又或者克隆了某個項目,想回顧下提交歷史,我們可以使用 git log 命令查看。
針對我們前一章節的操作,使用 git log 命令列出歷史提交記錄如下:
- git log - 查看歷史提交記錄。
- git blame <file> - 以列表形式查看指定文件的歷史修改記錄。
?我們可以用 --oneline 選項來查看歷史記錄的簡潔的版本。
$ git log --oneline $ git log --oneline d5e9fc2 (HEAD -> master) Merge branch 'change_site' c68142b 修改代碼 7774248 (change_site) changed the sunjiaoshou.php c1501a2 removed test.txt、add sunjiaoshou.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 log 命令可查看:http://git-scm.com/docs/git-log
git blame
如果要查看指定文件的修改記錄可以使用 git blame 命令,格式如下:
git blame <file>git blame 命令是以列表形式顯示修改記錄,如下實例:
$ git blame README ^d2097aa (tianqixin 2020-08-25 14:59:25 +0800 1) # 孫叫獸 Git 測試 db9315b0 (runoob 2020-08-25 16:00:23 +0800 2) # 微信公眾號:電商程序員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 sunjiaoshou.php * | c68142b 修改代碼 |/ * c1501a2 removed test.txt、add sunjiaoshou.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 sunjiaoshou.php * | c68142b 修改代碼 |/ * c1501a2 removed test.txt、add sunjiaoshou.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 作為遠程倉庫,
添加遠程庫
要添加一個新的遠程倉庫,可以指定一個簡單的名字,以便將來引用,命令格式如下:
git remote add [shortname] [url]本例以 Github 為例作為遠程倉庫,如果你沒有 Github 可以在官網 https://github.com/注冊。
由于你的本地 Git 倉庫和 GitHub 倉庫之間的傳輸是通過SSH加密的,所以我們需要配置驗證信息:
使用以下命令生成 SSH Key:
$ ssh-keygen -t rsa -C "1748917492@qq.com"后面的1748917492@qq.com 改為你在 Github 上注冊的郵箱,之后會要求確認路徑和輸入密碼,我們這使用默認的一路回車就行。
成功的話會在 ~/ 下生成 .ssh 文件夾,進去,打開 id_rsa.pub,復制里面的 key。
$ ssh-keygen -t rsa -C "1748917492@qq.com" Generating public/private rsa key pair. Enter file in which to save the key (/Users/tianqixin/.ssh/id_rsa): Enter passphrase (empty for no passphrase): # 直接回車 Enter same passphrase again: # 直接回車 Your identification has been saved in /Users/tianqixin/.ssh/id_rsa. Your public key has been saved in /Users/tianqixin/.ssh/id_rsa.pub. The key fingerprint is: SHA256:MDKVidPTDXIQoJwoqUmI4LBAsg5XByBlrOEzkxrwARI 429240967@qq.com The key's randomart image is: +---[RSA 3072]----+ |E*+.+=**oo | |%Oo+oo=o. . | |%**.o.o. | |OO. o o | |+o+ S | |. | | | | | | | +----[SHA256]-----+回到 github 上,進入 Account => Settings(賬戶配置)。
?
左邊選擇 SSH and GPG keys,然后點擊 New SSH key 按鈕,title 設置標題,可以隨便填,粘貼在你電腦上生成的 key。
?
添加成功后界面如下所示
?為了驗證是否成功,輸入以下命令:
$ ssh -T git@github.com The authenticity of host 'github.com (52.74.223.119)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes # 輸入 yes Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts. 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 sunjiaoshou-test.txt # 添加文件 $ git add sunjiaoshou-test.txt $ git commit -m "添加到遠程" master 69e702d] 添加到遠程1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 sunjiaoshou-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)Git Gitee
家都知道國內訪問 Github 速度比較慢,很影響我們的使用。
如果你希望體驗到 Git 飛一般的速度,可以使用國內的 Git 托管服務——Gitee(gitee.com)。
Gitee 提供免費的 Git 倉庫,還集成了代碼質量檢測、項目演示等功能。對于團隊協作開發,Gitee 還提供了項目管理、代碼托管、文檔管理的服務,5 人以下小團隊免費。
接下來我們學習一下如何使用 Gitee。
由于我們的本地 Git 倉庫和 Gitee 倉庫之間的傳輸是通過SSH加密的,所以我們需要配置驗證信息。
1、我們先在 Gitee 上注冊賬號并登錄后,然后上傳自己的 SSH 公鑰。
我們在 Git Github 章節已經生成了自己的 SSH 公鑰,所以我們只需要將用戶主目錄下的 ~/.ssh/id_rsa.pub 文件的內容粘貼 Gitee 上。
選擇右上角用戶頭像 -> 設置,然后選擇 "SSH公鑰",填寫一個便于識別的標題,然后把用戶主目錄下的 .ssh/id_rsa.pub 文件的內容粘貼進去:
成功添加后如下圖所示:
接下來我們創建一個項目。
點擊右上角的 + 號,新建倉庫:
然后添加倉庫信息:
?創建成功后看到如下信息:
接下來我們看下連接信息:
?
?
項目名稱最好與本地庫保持一致。
然后,我們在本地庫上使用命令 git remote add 把它和 Gitee 的遠程庫關聯:
git remote add origin git@gitee.com:imnoob/sunjiaoshou-test.git之后,就可以正常地用 git push 和 git pull 推送了!
如果在使用命令 git remote add 時報錯:
git remote add origin git@gitee.com:imnoob/sunjiaoshou-test.git fatal: remote origin already exists.這說明本地庫已經關聯了一個名叫 origin 的遠程庫,此時,可以先用 git remote -v 查看遠程庫信息:
git remote -v origin git@github.com:tianqixin/sunjiaoshou.git (fetch) origin git@github.com:tianqixin/sunjiaoshou.git (push)?
可以看到,本地庫已經關聯了 origin 的遠程庫,并且,該遠程庫指向 GitHub。
我們可以刪除已有的 GitHub 遠程庫:
git remote rm origin再關聯 Gitee 的遠程庫(注意路徑中需要填寫正確的用戶名):
git remote add origin git@gitee.com:imnoob/sunjiaoshou-test.git?此時,我們再查看遠程庫信息:
git remote -v origin git@gitee.com:imnoob/sunjiaoshou-test.git (fetch) origin git@gitee.com:imnoob/sunjia0sou-test.git (push)現在可以看到,origin 已經被關聯到 Gitee 的遠程庫了。
通過 git push 命令就可以把本地庫推送到 Gitee 上。
有的小伙伴又要問了,一個本地庫能不能既關聯 GitHub,又關聯 Gitee 呢?
答案是肯定的,因為 git 本身是分布式版本控制系統,可以同步到另外一個遠程庫,當然也可以同步到另外兩個遠程庫。
使用多個遠程庫時,我們要注意,git 給遠程庫起的默認名稱是 origin,如果有多個遠程庫,我們需要用不同的名稱來標識不同的遠程庫。
仍然以 sunjiaoshou-test 本地庫為例,我們先刪除已關聯的名為 origin 的遠程庫:
git remote rm origin然后,先關聯 GitHub 的遠程庫:
git remote add github git@github.com:tianqixin/sunjiaoshou-git-test.git注意,遠程庫的名稱叫 github,不叫 origin 了。
接著,再關聯 Gitee 的遠程庫:
git remote add gitee git@gitee.com:imnoob/sunjiaoshou-test.git同樣注意,遠程庫的名稱叫 gitee,不叫 origin。
現在,我們用 git remote -v 查看遠程庫信息,可以看到兩個遠程庫:
git remote -v gitee git@gitee.com:imnoob/sunjiaoshou-test.git (fetch) gitee git@gitee.com:imnoob/sunjiaoshou-test.git (push) github git@github.com:tianqixin/sunjiaoshou.git (fetch) github git@github.com:tianqixin/sunjiaoshou.git (push)如果要推送到 GitHub,使用命令:
git push github master如果要推送到 Gitee,使用命令:
git push gitee master這樣一來,我們的本地庫就可以同時與多個遠程庫互相同步:
?
?
Git 服務器搭建
我們遠程倉庫使用了 Github,Github 公開的項目是免費的,2019 年開始 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 git2、創建證書登錄
收集所有需要登錄的用戶的公鑰,公鑰位于id_rsa.pub文件中,把我們的公鑰導入到/home/git/.ssh/authorized_keys文件里,一行一個。
如果沒有該文件創建它:
$ cd /home/git/ $ mkdir .ssh $ chmod 755 .ssh $ touch .ssh/authorized_keys $ chmod 644 .ssh/authorized_keys3、初始化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/sunjiaoshou.git/以上命令Git創建一個空倉庫,服務器上的Git倉庫通常都以.git結尾。然后,把倉庫所屬用戶改為git:
$ chown -R git:git sunjiaoshou.git4、克隆倉庫?
$ git clone git@192.168.45.4:/home/gitrepo/sunjiaoshou.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簡易教程: https://blog.csdn.net/weixin_41937552/article/details/106313322
歡迎大家關注我的公眾號:電商程序員,回復關鍵詞“Git常用命令”獲取git常用命令圖譜
總結
以上是生活随笔為你收集整理的Git教程学习总结(分享给热爱学习的你,团队的协作离不开你呀)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大前端最强vscode教程(基础篇)
- 下一篇: 为啥这么多程序员大佬学习Cortex-M