1. 程式人生 > >Git入門到高級系列1-git安裝與基礎命令

Git入門到高級系列1-git安裝與基礎命令

操作日誌 https aes key 菜單 apt-get system wrap ebp

視頻課程地址

騰訊課堂

為什麽要進行項目文件的版本管理

  1. 代碼備份和恢復
  2. 團隊開發和協作流程
  3. 項目分支管理和備份

git 是什麽?

git是一個分布式的版本控制軟件。版本控制是一種記錄一個或若幹文件內容變化,以便將來查閱特定版本修訂情況的系統。

最初由林納斯·托瓦茲創作,於2005年以GPL釋出。最初目的是為更好地管理Linux內核開發而設計。

2005年,安德魯·垂鳩寫了一個簡單程序,可以連接BitKeeper的存儲庫,BitKeeper著作權擁有者拉裏·麥沃伊認為安德魯·垂鳩對BitKeeper內部使用的協議進行逆向工程,決定收回無償使用BitKeeper的許可。Linux內核開發團隊與BitMover公司進行磋商,但無法解決他們之間的歧見。林納斯·托瓦茲決定自行開發版本控制系統替代BitKeeper,以十天的時間,編寫出第一個git版本.

集中式和分布式版本控制軟件

集中式版本控制軟件

集中化的版本控制系統(Centralized Version Control Systems,簡稱 CVCS)應運而生。 這類系統,諸如 CVSSubversion 以及 Perforce 等,都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。

集中式管理的缺點:

  1. 中央服務器的單點故障,導致整個版本管理癱瘓
  2. 中央服務器故障導致所有的版本丟失
  3. 當客戶端和服務器端無法進行網絡連接的時,客戶端無法進行提交代碼和保存版本,也不能恢復某個版本
技術分享圖片
集中式

分布式版本控制軟件

分布式版本控制系統(Distributed Version Control System,簡稱 DVCS).分布式就是每個人都有一份完整的倉庫版本,提交和管理都是在本地進行,當然也可以進行遠程的倉庫之間進行合並提交等操作。

技術分享圖片 分布式

git 安裝

Linux 上安裝

如果你想在 Linux 上用二進制安裝程序來安裝 Git,可以使用發行版包含的基礎軟件包管理工具來安裝。 如果 以 Fedora 上為例,你可以使用 yum:

$ sudo yum install git

如果你在基於 Debian 的發行版上,請嘗試用 apt-get:

$ sudo apt-get install git

要了解更多選擇,Git 官方網站上有在各種 Unix 風格的系統上安裝步驟,網址為 http://git-scm.com/download/linux。

在 Mac 上安裝

方法一:

最簡單的方法是安裝 Xcode Command Line Tools,然後在 Terminal 裏嘗試首次運行 git 命令即可。 如果沒有安裝過命令行開發者工具,將會提示 你安裝。

方法二:(推薦)

使用 homebrew

$ brew install git

windows上安裝

直接下載安裝包:https://gitforwindows.org/

檢測是否安裝成功

windows請從開始菜單程序中打開gitbash,其他系統請打開終端工具或者shell命令行工具。

$ git --version

# 輸出,僅供參考
git version 2.18.0

git 快速上手和配置

用戶名和郵箱配置

當安裝完 Git 應該做的第一件事就是設置你的用戶名稱與郵件地址。 這樣做很重要,因為每一個 Git 的提交都會 使用這些信息,並且它會寫入到你的每一次提交中。

windows請從開始菜單程序中打開gitbash,其他系統請打開終端工具或者shell命令行工具。

$ git config --global user.name "aicoder"
$ git config --global user.email [email protected]

請把用戶名和郵箱換成你自己的

如果使用了 --global 選項,那麽該命令只需要運行一次,因為之後無論你在該系統上做任何事 情, Git 都會使用那些信息。 當你想針對特定項目使用不同的用戶名稱與郵件地址時,可以在那個項目目錄下運 行沒有 --global 選項的命令來配置。

以上配置完成後,檢測是否配置成功:

$ git config --list

# 輸出以下內容,僅供參考
credential.helper=osxkeychain
user.name=aicoder
[email protected]
color.status=auto
...

配置SSH

Git 服務器大部分都使用 SSH 公鑰進行認證,其他認證方式都不方便,創建SSH公鑰的方法。

請打開用gitbash或者終端工具運行以下命令

默認情況下,用戶的 SSH 密鑰存儲在其 ~/.ssh 目錄下。 進入該目錄並列出其中內容,你便可以快 速確認自己是否已擁有密鑰:

$ cd ~/.ssh
$ ls
authorized_keys2  id_dsa       known_hosts
config            id_dsa.pub

cd命令可以幫助我們進入系統的某個目錄。 ls命令可以列出當前目錄下面的所有文件和文件夾的信息。

如果已經存在id_dsaid_dsa.pub,說明就已經生成果,後面的步驟可以省略。

id_dsa 或 id_rsa 命名的文件,其中一個帶有 .pub 擴展名。 .pub 文件是你的公鑰,另 一個則是私鑰。

  $ ssh-keygen

  # 一路回車回車即可,以下為輸出內容,僅供參考
  Generating public/private rsa key pair.
  Enter file in which to save the key (/home/schacon/.ssh/id_rsa):
  Created directory ‘/home/schacon/.ssh‘.
  Enter passphrase (empty for no passphrase):
  Enter same passphrase again:
  Your identification has been saved in /home/schacon/.ssh/id_rsa.
  Your public key has been saved in /home/schacon/.ssh/id_rsa.pub.
  The key fingerprint is:
  d0:82:24:8e:d7:f1:bb:9b:33:53:96:93:49:da:9b:e3 [email protected]

首先 ssh-keygen 會確認密鑰的存儲位置(默認是 .ssh/id_rsa),然後它會要求你輸入兩次密鑰口令。如 果你不想在使用密鑰時輸入口令,將其留空即可。

git基本操作

在現有目錄中初始化倉庫

$ cd /path/to/init
$ git init

此時在目錄中將創建一個名為 .git 的子目錄,這裏面存放當前倉庫的所有的跟蹤的信息。

此時當前文件夾下面的所有的文件都沒有被跟蹤,如果需要跟蹤變化,必須添加到跟蹤的參考中。

添加文件和提交信息

git add 文件 命令可以幫祝我們讓git幫忙跟蹤具體的文件。然後執行git commit提交信息,相當於確認跟蹤。

$ git add ./*.js
$ git add a.txt
$ git commit -m ‘first commit‘

提交記錄的時候必須添加消息,而且添加的消息還有一定的規範,每個公司的提交消息規範不一樣,視情況而定。

參考:你可能會忽略的 Git 提交規範

技術分享圖片 工作目錄和暫存區

工作區和暫存區

  • 工作區(Working Directory)

工作區,也稱為工作目錄,也就是要進行版本管理的文件夾。

  • 暫存區(Stage或者Index)

暫時存放將要記錄修改版本的文件的區域。

技術分享圖片 工作目錄和暫存區

工作目錄下的每一個文件都不外乎這兩種狀態:已跟蹤或未跟蹤。

git add可以把文件加入暫存區。 git commit命令可以把暫存區的文件更新變化記錄到版本庫中永久保存。

不在暫存區的文件,不會被追蹤。

技術分享圖片 文件修改的流程

暫存區和版本庫存放在 .git目錄中。

檢查當前文件狀態

要查看哪些文件處於什麽狀態,可以用 git status 命令。 如果在克隆倉庫後立即使用此命令,會看到類似這 樣的輸出:

$ git status

以下是沒有任何修改和暫存的情況:

On branch master
Your branch is up to date with ‘origin/master‘.

nothing to commit, working tree clean

以下是有修改未提交,有新增加為加入暫存區的情況:

On branch master
Your branch is up to date with ‘origin/master‘.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   docs/pages/vip_3git.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        docs/images/0.jpeg
        docs/images/zc.png

no changes added to commit (use "git add" and/or "git commit -a")

狀態簡覽

git status 命令的輸出十分詳細,但其用語有些繁瑣。 如果你使用 git status -s 命令或 git status --short命令,你將得到一種更為緊湊的格式輸出。運行git status -s,狀態報告輸出如下:

$ git status -s
M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

查看文件的日誌

git log命令幫助我們輸出git的所有操作日誌。

$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]>
Date:   Mon Mar 17 21:52:11 2008 -0700
    changed the version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <[email protected]>
Date:   Sat Mar 15 16:40:33 2008 -0700
    removed unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <[email protected]>
Date:   Sat Mar 15 10:31:28 2008 -0700
first commit

按q鍵可以退出查看日誌,回車鍵查看更多。

  • 查看修改的差異

git log -p

  • 查看最近兩次的差異

git log -p -2

  • 查看每次提交的總結

正如你所看到的,--stat 選項在每次提交的下面列出所有被修改過的文件、有多少文件被修改了以及被修改過 的文件的哪些行被移除或是添加了。 在每次提交的最後還有一個總結。

git log --stat

  • 在一行內顯示日誌

git log --oneline

  • 圖形化輸出

git log --graph

其他參數

選項說明
-p 按補丁格式顯示每個更新之間的差異。
--stat 顯示每次更新的文件修改統計信息。
--shortstat 只顯示 --stat 中最後的行數修改添加移除統計。
--name-only 僅在提交信息後顯示已修改的文件清單。
--name-status 顯示新增、修改、刪除的文件清單。
--abbrev-commit 僅顯示 SHA-1 的前幾個字符,而非所有的 40 個字符。
--relative-date 使用較短的相對時間顯示(比如,“2 weeks ago”)。
--graph 顯示 ASCII 圖形表示的分支合並歷史。
--pretty 使用其他格式顯示歷史提交信息。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式)

取消新添加文件的暫存狀態

如果你不小心添加了一個文件,但本不想讓它進行跟蹤管理,僅僅是臨時使用,那麽怎樣才能從暫存區取消呢?

# 進入項目目錄
$ cd /path/to
# 添加一個文件
$ touch a.txt
# 添加到暫存區
$ git add a.txt

此時查看git的情況:

$ git status
# 查看當前文件,在暫存區等待提交。
On branch master
Your branch is up to date with ‘origin/master‘.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

  new file:   a.txt

取消暫存:

$ git reset HEAD a.txt
$ git status
# 可以看到a.txt是未跟蹤狀態了。

取消已經跟蹤文件的暫存狀態

如果一個文件已經被跟蹤過了,而且已經修改後被add到了暫存區現在想取消修改暫存狀態。

$ git reset HEAD a.txt
$ git checkout -- a.txt

git checkout -- [file]是一個危險的命令。你對那個文件做的任何修改都會消失 - 你只是拷貝了另一個文件來覆蓋它。

全部回滾:

git reset --hard HEAD

--hard 會讓工作目錄也會回滾到未修改之前的狀態。

回滾文件

讓某個文件回滾到某個版本的狀態。

$ git checkout -- filepath
技術分享圖片 操作路線 技術分享圖片 git回滾原理

忽略文件

一般我們總會有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。 通常都是些自動生成的文 件,比如日誌文件,或者編譯過程中創建的臨時文件等。 在這種情況下,我們可以創建一個名為 .gitignore 的文件,列出要忽略的文件模式。

我們再看一個 .gitignore 文件的例子: ‘

# no .a files
*.a
# but do track lib.a, even though you‘re ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf

一般此文件會放到工作目錄的根目錄下,此文件中匹配的所有文件都會被git所有的命令忽略。
<pre v-pre="" data-lang="sh" Roboto Mono", Monaco, courier, monospace; line-height: 1.5rem; margin: 1.2em 0px; overflow: auto; padding: 0px 1.4rem; position: relative; overflow-wrap: normal; color: rgb(52, 73, 94); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> Copy to clipboardErrorCopied </pre>

![<pre v-pre="" data-lang="sh" Roboto Mono", Monaco, courier, monospace; line-height: 1.5rem; margin: 1.2em 0px; overflow: auto; padding: 0px 1.4rem; position: relative; overflow-wrap: normal; color: rgb(52, 73, 94); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> Copy to clipboardErrorCopied </pre>

技術分享圖片 操作路線

技術分享圖片 git回滾原理


](//upload-images.jianshu.io/upload_images/4393631-804316867889598c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

技術分享圖片 git回滾原理

視頻課程地址

騰訊課堂

Git入門到高級系列1-git安裝與基礎命令