1. 程式人生 > 其它 >git基本操作詳細介紹

git基本操作詳細介紹

簡介

本文會簡單介紹git的基本操作。
這篇文章適合對git的安裝、使用、執行環境、工作原理有一定了解的人員閱讀;
對於初學者,可以先參考以下文章:
最新git安裝教程

windows系統git安裝教程

git入門教程,手把手教

git基本操作

git有哪些基本操作呢?可以在git bash上輸入命令 git help檢視各種情況下使用的常用Git命令。
如下圖所示:

guest1@DESKTOP-zzc MINGW64 ~/Desktop
$ git help
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           [--super-prefix=<path>] [--config-env=<name>=<envvar>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone     Clone a repository into a new directory
   init      Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add       Add file contents to the index
   mv        Move or rename a file, a directory, or a symlink
   restore   Restore working tree files
   rm        Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect    Use binary search to find the commit that introduced a bug
   diff      Show changes between commits, commit and working tree, etc
   grep      Print lines matching a pattern
   log       Show commit logs
   show      Show various types of objects
   status    Show the working tree status

grow, mark and tweak your common history
   branch    List, create, or delete branches
   commit    Record changes to the repository
   merge     Join two or more development histories together
   rebase    Reapply commits on top of another base tip
   reset     Reset current HEAD to the specified state
   switch    Switch branches
   tag       Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch     Download objects and refs from another repository
   pull      Fetch from and integrate with another repository or a local branch
   push      Update remote refs along with associated objects

也可以輸入git help -a檢視所有支援的git命令,這裡不展開描述。

下面就讓我們一一瞭解git的基本操作

開始一個工作區域

這裡涉及到兩個命令:clone和init,他們可以用來建立倉庫。

下表列出了 git 建立倉庫的命令:

命令 說明
git init 初始化倉庫
git clone 拷貝一份遠端倉庫,也就是下載一個專案

git init命令

git init 命令用於在目錄中建立新的 Git 倉庫。
在目錄中執行 git init 就可以建立一個 Git 倉庫了。
例如我們在當前目錄下建立一個名為 runoob 的專案:

$ mkdir test
$ cd test/
$ git init
#初始化空 Git 倉庫完畢。

現在你可以看到在你的專案中生成了 .git 這個子目錄,這就是你的 Git 倉庫了,所有有關你的此專案的快照資料都存放在這裡。
.git 預設是隱藏的,可以用 ls -a 命令檢視:

$ ls -a
./  ../  .git/

git clone 命令

git clone 拷貝一個 Git 倉庫到本地,讓自己能夠檢視該專案,或者進行修改。

拷貝專案命令格式如下:

git clone [url]

[url] 是你要拷貝的專案。

例如我們拷貝 Github 上的專案

$ git clone https://github.com/lxyjrx/test1
Cloning into 'test1'...
remote: Enumerating objects: 53, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 53 (delta 11), reused 28 (delta 8), pack-reused 15
Receiving objects: 100% (53/53), 18.47 KiB | 1.42 MiB/s, done.
Resolving deltas: 100% (11/11), done.

拷貝完成後,在當前目錄下會生成一個test1 目錄:

guest1@DESKTOP-zzc MINGW64 /e/git project/test (master)
$ ls
test1/
guest1@DESKTOP-zzc MINGW64 /e/git project/test (master)
$ cd test1
guest1@DESKTOP-zzc MINGW64 /e/git project/test/test1 (master)
$ ls
1.c  example/  readme.txt  test1.txt

上述操作將複製該專案的全部記錄。

預設情況下,Git 會按照你提供的 URL 所指向的專案的名稱建立你的本地專案目錄。 通常就是該 URL 最後一個 / 之後的專案名稱。如果你想要一個不一樣的名字, 你可以在該命令後加上你想要的名稱。

例如,以下例項拷貝遠端 git 專案,本地專案名為 mytest:

guest1@DESKTOP-zzc MINGW64 /e/git project/test (master)
$ git clone https://github.com/lxyjrx/test1 mytest
Cloning into 'mytest'...
remote: Enumerating objects: 53, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 53 (delta 11), reused 28 (delta 8), pack-reused 15
Receiving objects: 100% (53/53), 18.47 KiB | 1.85 MiB/s, done.
Resolving deltas: 100% (11/11), done.

guest1@DESKTOP-zzc MINGW64 /e/git project/test (master)
$ ls -l
total 0
drwxr-xr-x 1 guest1 197609 0 Apr 26 18:17 mytest/
drwxr-xr-x 1 guest1 197609 0 Apr 26 18:11 test1/

從上面可以看到,本地多了一個mytest目錄,裡面有我們剛克隆的git倉庫。

處理當前變化

這裡涉及了4個命令:

*****將檔案內容新增到暫存區*****
add       Add file contents to the index()
*****移動或重新命名檔案、目錄或符號連結*****
mv        Move or rename a file, a directory, or a symlink
*****恢復工作樹檔案*****
restore   Restore working tree files
******從工作樹和暫存區中刪除檔案****
rm        Remove files from the working tree and from the index

git add 命令

git add 命令可將該檔案新增到暫存區。

新增一個或多個檔案到暫存區:

git add [file1] [file2] ...

新增指定目錄到暫存區,包括子目錄:

git add [dir]

添加當前目錄下的所有檔案到暫存區:

git add .

以下例項我們新增兩個檔案(2.txt 3.txt):

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ touch 2.txt 3.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ ls
1.c  2.txt  3.txt  example/  readme.txt  test1.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status -s
?? 2.txt
?? 3.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)

git status 命令用於檢視專案的當前狀態。

接下來我們執行 git add 命令來新增檔案:

git add 2.txt 3.txt

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

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git add 2.txt 3.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status -s
A  2.txt
A  3.txt

新專案中,新增所有檔案很普遍,我們可以使用 git add . 命令來添加當前專案的所有檔案。

現在我們修改 2.txt檔案:

$ vim 2.txt

在 2.txt 中新增以下內容:12345 ,然後儲存退出。

再執行一下 git status:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status -s
AM 2.txt
A  3.txt

AM 狀態的意思是這個檔案在我們將它新增到快取之後又有改動。改動後我們再執行 git add . 命令將其新增到快取中:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git add .
warning: LF will be replaced by CRLF in 2.txt.
The file will have its original line endings in your working directory

檔案修改後,我們一般都需要進行 git add 操作,從而儲存歷史版本。

git mv命令

git mv 命令用於移動或重新命名一個檔案、目錄或軟連線。

git mv [file] [newfile]

如果新檔名已經存在,但還是要重新命名它,可以使用 -f 引數:

git mv -f [file] [newfile]

示例如下:

$ git mv 2.txt 5.txt
guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git mv 2.txt 5.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ ls
1.c  3.txt  5.txt  example/  readme.txt  test1.txt

git restore命令

下面通過一個示例來說明這個命令可以做什麼。

用法1:

(1)先用git status看一下狀態

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

(2)開啟a.c新增點內容(原本內容是aaa)

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ vim 1.c

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ cat 1.c
aaaa1234

(3)再用git status看一下狀態

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

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

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

此時a.c的狀態是剛剛更改過,但是還沒有用git add指令新增到暫存區中,也就是說a.c目前處於工作區下。

(4)使用git restore
也就是:git restore a.c

(5)再用git status看一下狀態

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

(6)最後看一下1.c中的內容

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ cat 1.c
aaaa

結論:git restore指令使得在工作區但是不在暫存區的檔案撤銷更改(內容恢復到沒修改之前的狀態)

用法2:

(1)先用git status看下狀態,再用cat 1.c 看下1.c檔案的內容

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ cat 1.c
aaaa

(2)修改檔案1.c內容並新增到暫存區,然後檢視狀態:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ vi 1.c

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git add 1.c

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   1.c

(5)使用git restore --staged

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git restore --staged 1.c

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ cat 1.c
aaaa1234

可以看到使用git restore --staged之後,檔案的內容並沒有改變。

結論:git restore --staged的作用是將暫存區的檔案從暫存區撤出,但不會更改檔案的內容。

git rm 命令

git rm 命令用於刪除檔案。

如果只是簡單地從工作目錄中手工刪除檔案(如rm xxx),執行 git status 時就會有Changes not staged for commit 的提示。

git rm 刪除檔案有以下幾種形式:

1、將檔案從暫存區和工作區中刪除:

git rm < file >

以下例項從暫存區和工作區中刪除 1.c 檔案:

git rm 1.c

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

強行從暫存區和工作區中刪除修改後的 1.c 檔案:

git rm -f 1.c

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

git rm --cached < file >

以下例項從暫存區中刪除 1.c 檔案:

git rm --cached 1.c

可以遞迴刪除,即如果後面跟的是一個目錄做為引數,則會遞迴刪除整個目錄中的所有子目錄和檔案:

git rm –r * 

檢查歷史和狀態

這裡會介紹幾個命令:diff、grep、log、status。

git diff

git diff 命令比較檔案的不同,即比較檔案在暫存區和工作區的差異。

尚未快取的改動:git diff
檢視已快取的改動: git diff --cached
檢視已快取的與未快取的所有改動:git diff HEAD
顯示摘要而非整個 diff:git diff --stat

顯示暫存區和工作區的差異:

$ git diff [file]

顯示暫存區和上一次提交(commit)的差異:

$ git diff --cached [file]

$ git diff --staged [file]

顯示兩次提交之間的差異:

$ git diff [first-branch]...[second-branch]
first-branch、second-branch是提交的版本號

git grep

這個命令可以在當前目錄下查詢指定的字串。

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ ls
1.c  example/  readme.txt  test1.txt

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git grep "aaaa"
1.c:aaaa1234

git log

Git 檢視提交歷史一般常用兩個命令:
git log - 檢視歷史提交記錄。
git blame - 以列表形式檢視指定檔案的歷史修改記錄。

在使用 Git 提交了若干更新之後,又或者克隆了某個專案,想回顧下提交歷史,我們可以使用 git log 命令檢視。
使用 git log 命令列出歷史提交記錄如下:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git log
commit 208a138177fffc76e98ee9fd5850d000b4b55dab (HEAD -> master)
Author: zzc <[email protected]>
Date:   Tue Apr 26 19:03:06 2022 +0800

    修改檔案內容為aaaa

commit 2ae95495c2d7f86995d83cc281f5ff31630ac968 (origin/master, origin/HEAD)
Author: zzc <[email protected]>
Date:   Fri Apr 22 00:52:20 2022 +0800

    Update readme.txt

commit 74bd81bfefd6c37110ae1ba0c99346da24f1960c
Author: zzc <[email protected]>
Date:   Fri Apr 22 00:49:48 2022 +0800

    刪除不需要的檔案2.txt

commit 5ae7b7506970e32da33275900561d770bffe98eb
Author: zzc <[email protected]>
Date:   Fri Apr 22 00:37:00 2022 +0800

    Update p1.c

    新增程式碼註釋

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

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git log --oneline
208a138 (HEAD -> master) 修改檔案內容為aaaa
2ae9549 (origin/master, origin/HEAD) Update readme.txt
74bd81b 刪除不需要的檔案2.txt
5ae7b75 Update p1.c
22732d4 新增linux程序相關示例程式碼
3642911 新增新檔案2.txt
75b314e 新增檔案1.c
f2f8da5 Delete test2.c

我們還可以用 --graph 選項,檢視歷史中什麼時候出現了分支、合併。示例如下:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git log --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
caa6afc 提交readme.txt檔案
2ba0743 新增2222到readme.txt
80332f6 新增33333到readme.txt
ac066d6 新增新檔案test1.txt
532c695 提交所有檔案
9724dfc add file test2.c

如果只想查詢指定使用者的提交日誌可以使用命令:git log --author , 例如,比方說我們要找 Git 原始碼中 zzc 提交的部分:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git log --author=zzc --oneline -5
208a138 (HEAD -> master) 修改檔案內容為aaaa
2ae9549 (origin/master, origin/HEAD) Update readme.txt
74bd81b 刪除不需要的檔案2.txt
5ae7b75 Update p1.c
22732d4 新增linux程序相關示例程式碼

如果你要指定日期,可以執行幾個選項:--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 < file >

git blame 命令是以列表形式顯示修改記錄,如下例項:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git blame readme.txt
2ae95495 (zzc 2022-04-22 00:52:20 +0800 1) example目錄下存放的是示例程式碼。
2ae95495 (zzc 2022-04-22 00:52:20 +0800 2) 示例程式碼包括linux系統程序間通訊示例程式碼及其他程式碼。

git status

git status 命令用於檢視在你上次提交之後是否有對檔案進行再次修改。
示例如下:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   1.c

通常我們使用 -s 引數來獲得簡短的輸出結果:

guest1@DESKTOP-zzc MINGW64 /e/git project/test/mytest (master)
$ git status -s
M  1.c

成長,標記和調整你的共同歷史

這一部分會介紹branch、commit 、 merge、reset這幾個命令。

git branch

建立分支命令:

git branch (branchname)

切換分支命令:

git checkout (branchname)

列出分支基本命令:

git branch

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

$ git branch
* master

上面的例子意思是,我們有一個叫做 master 的分支,並且該分支是當前分支。

當你執行 git init 的時候,預設情況下 Git 就會為你建立 master 分支。如果我們要手動建立一個分支。執行 git branch (branchname) 即可。

$ git branch testing
$ git branch
* master
  testing

現在我們可以看到,有了一個新分支 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.txt
 1 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 runoob.php
$ git add .
$ git commit -am 'removed test.txt、add runoob.php'
[newtest c1501a2] removed test.txt、add runoob.php
 2 files changed, 1 deletion(-)
 create mode 100644 runoob.php
 delete 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)

git merge

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

git merge branch1
把分支branch1合併到當前分支

合併分支的時候如果出現衝突,那麼我們可以手動修復衝突的內容,然後可以git add命令告訴 Git 檔案衝突已經解決,最後重新提交即可。

合併完分支後我們可以刪除分支,示例如下:

guest1@DESKTOP-zzc MINGW64 /e/git project/test2 (master)
$ git merge b1
Merge made by the 'ort' strategy.
 readme | 1 -
 1 file changed, 1 deletion(-)
 delete mode 100644 readme

guest1@DESKTOP-zzc MINGW64 /e/git project/test2 (master)
$ git branch
  b1
* master

guest1@DESKTOP-zzc MINGW64 /e/git project/test2 (master)
$ git branch -d b1
Deleted branch b1 (was 845c619).

guest1@DESKTOP-zzc MINGW64 /e/git project/test2 (master)
$ git branch
* master

git commit

git commit 命令將暫存區內容新增到本地倉庫中。

提交暫存區到本地倉庫中:

git commit -m [message]
[message] 可以是一些備註資訊。

提交暫存區的指定檔案到倉庫區:

git commit [file1] [file2] ... -m [message]

-a 引數設定修改檔案後不需要再輸入git add 命令,直接來提交

$ git commit -a

提交開始前我們需要先設定提交的使用者資訊,包括使用者名稱和郵箱:

$ git config --global user.name 'zzc'
$ git config --global user.email [email protected]

如果去掉 --global 引數只對當前倉庫有效。

想要快速提交,修改檔案內容後直接輸入以下命令即可:

$ git commit -am '修改 1.txt 檔案'

git reset

git reset 命令,用於回退版本,可以指定退回某一次提交的版本。

git reset 命令語法格式如下:

git reset [--soft | --mixed | --hard] [HEAD]

"-- mixed" 為預設,可以不用帶該引數,用於重置暫存區的檔案與上一次的提交(commit)保持一致,工作區檔案內容保持不變。

git reset  [HEAD] 

例項:

$ git reset HEAD^            # 回退所有內容到上一個版本  
$ git reset HEAD^ hello.php  # 回退 hello.php 檔案的版本到上一個版本  
$ git  reset  052e           # 回退到指定版本

"-- soft" 引數用於回退到某個版本:

git reset --soft HEAD

例項:

$ git reset --soft HEAD~3 # 回退到上上上一個版本

"-- hard" 引數撤銷工作區中所有未提交的修改內容,將暫存區與工作區都回到上一次版本,並刪除之前的所有資訊提交:

git reset --hard HEAD

例項:

$ git reset --hard HEAD~3  # 回退上上上一個版本  
$ git reset --hard bae128  # 回退到某個版本回退點之前的所有資訊。 
$ git reset --hard origin/master    # 將本地的狀態回退到和遠端的一樣 

注意:謹慎使用 --hard 引數,它會刪除回退點之前的所有資訊。

HEAD 說明:
HEAD 表示當前版本
HEAD^ 上一個版本
HEAD^^ 上上一個版本
HEAD^^^ 上上上一個版本
以此類推...

可以使用 ~數字表示
HEAD~0 表示當前版本
HEAD~1 上一個版本
HEAD^2 上上一個版本
HEAD^3 上上上一個版本
以此類推...

git reset HEAD 命令可以用來撤銷暫存區的改動。

總結一下:直接reset會把暫存區回退到指定版本,但工作區不受影響;加上soft暫存區不會回退,工作區也不受影響;如果帶hard引數則會把暫存區和工作區都回退到指定版本,且此回退版本之後的提交資訊會被刪除。

合作、協作

這一部分有幾個命令需要講講:remote、fetch、pull、push

git remote

git remote 命令用來操作遠端倉庫。

  • 顯示所有遠端倉庫:
git remote -v
  • 顯示某個遠端倉庫的資訊:

git remote show [remote]

  • 連線 遠端倉庫

git remote add origin <REMOTE_URL>

origin是遠端倉庫本地名,REMOTE_URL是遠端倉庫的url

例子:

git remote add origin https://github.com/lxyjrx/temp1.git
git remote add origin [email protected]:lxyjrx/temp1.git
  • 切換遠端倉庫URL
git remote set-url origin [email protected]:lxyjrx/temp1.git
  • 移除一個遠端倉庫url
git remote rm origin	//origin是遠端倉庫名
  • 遠端倉庫在本地重新命名

git remote rename old_name new_name

git fetch

git fetch 命令用於從遠端獲取程式碼庫。

git fetch是將遠端主機的最新內容拉到本地,使用者在檢查了以後決定是否合併到工作本機分支中。

而git pull 則是將遠端主機的最新內容拉下來後直接合並,即:git pull = git fetch + git merge,這樣可能會產生衝突,需要手動解決。

git fetch 命令:

$ git fetch <遠端主機名> //這個命令將某個遠端主機的更新全部取回本地

如果只想取回特定分支的更新,可以指定分支名:

$ git fetch <遠端主機名> <分支名> //注意之間有空格

最常見的命令如取回origin 主機的master 分支:

$ git fetch origin master

取回更新後,會返回一個FETCH_HEAD ,指的是某個branch在伺服器上的最新狀態,我們可以在本地通過它檢視剛取回的更新資訊:

$ git log -p FETCH_HEAD

如下圖:

可以看到返回的資訊包括更新的檔名,更新的作者和時間,以及更新的程式碼(19行紅色[刪除]和綠色[新增]部分)。

我們可以通過這些資訊來判斷是否產生衝突,以確定是否將更新merge到當前分支。

git pull

git pull 命令用於從遠端獲取程式碼併合並本地的版本。

git pull 其實就是 git fetch 和 git merge FETCH_HEAD 的簡寫。 命令格式如下:

git pull <遠端主機名> <遠端分支名>:<本地分支名>

比如,將遠端主機 origin 的 master 分支拉取過來,與本地的 brantest 分支合併。

git pull origin master:brantest

如果遠端分支是與當前分支合併,則冒號後面的部分可以省略。

git pull origin master

git push

git push 用於將本地的分支版本上傳到遠端併合並。

命令格式如下:

git push <遠端主機名> <本地分支名>:<遠端分支名>

如果本地分支名與遠端分支名相同,則可以省略冒號:

git push <遠端主機名> <本地分支名>

以下命令將本地的 master 分支推送到 origin 主機的 master 分支。

git push origin master

相等於:

git push origin master:master

如果本地版本與遠端版本有差異,但又要強制推送可以使用 --force 引數:

git push --force origin master

刪除主機的分支可以使用 --delete 引數,以下命令表示刪除 origin 主機的 master 分支:

git push origin --delete master

補充

1、如何避免每次pull或者push都要輸入私鑰口令?

方法1:直接修改私鑰的口令,如下格式:

ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]

示例如下:

guest1@DESKTOP-zzc MINGW64 /e/git project/mytestgit (master)
$ ssh-keygen -p -P 123456 -N '' -f ~/.ssh/id_rsa
Key has comment '[email protected]'
Your identification has been saved with the new passphrase.

方法2:

ssh 推薦的登入方式是使用私鑰登入。但是如果生成私鑰的時候,設定了口令/密碼(passphrase),每次登入時需要輸入口令也很麻煩。可以通過 ssh-agent 來管理私鑰,把私鑰載入進記憶體,之後便不用再輸入密碼。

操作步驟如下:(該方法需要使用)

  1. 打git的bash命令,輸入
	vi ~/.profile
  1. 鍵盤輸入"i",插入以下的內容:
env=~/.ssh/agent.env
 
agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
 
    (umask 077; ssh-agent >| "$env")
 
    . "$env" >| /dev/null ; }
    
agent_load_env
 
# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
 
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi
unset env
  1. 按下“ESC”,在命令列下輸入“:wq”。

經過實測,該方法只需要開機後輸入一次口令,後面的操作都不需要再次輸入。

總結

這篇文章適合那些對git的安裝、使用和工作原理有過一定了解的人員閱讀;
對於剛接觸的朋友來說,需要先了解git、github相關的一些概念,可以參考以下文章:

最新git安裝教程

windows系統git安裝教程

git入門教程,手把手教

到這裡為止,一些常用的git操作命令已經彙總完畢,一個一個驗證也花了不少時間,對這些東西有了更深刻的印象和理解;如果以後忘記了怎麼去使用,再回來看看吧。

好記性不如爛筆頭。