1. 程式人生 > >Git 快速入門

Git 快速入門

歷史 同事 init 自動生成 sca out cnblogs ati 應該

Git 基本操作

講師的博客:https://www.cnblogs.com/alex3714/articles/5930846.html
基本操作看之前自學的時候記的筆記:http://blog.51cto.com/steed/2138687
Git的官方文檔(有中文):https://git-scm.com/book/zh/v2

回滾到上一個版本

用下面的命令,可以方便的回滾到前一次的提交:

$ git reset --hard HEAD^
HEAD is now at 2db6c31 首次提交,開始叫Git

HEAD就是當前版本的位置,加上一個尖號(‘^’)就是向前一個版本。如果是向前2個版本就是2個尖號。

查看信息

回滾之後再查看log的話,只會有當前版本之前的log。這時可以用git reflog命令:

$ git log
commit 2db6c315f98fd11ef43d5114a071dca88dda238d (HEAD -> master)
Author: 騎士救兵 <[email protected]>
Date:   Thu Sep 20 15:01:45 2018 +0800

    首次提交,開始叫Git

$ git reflog
2db6c31 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
90a5288 HEAD@{1}: commit: 第二次提交,增加了哪幾期參加了git這節課
2db6c31 (HEAD -> master) HEAD@{2}: commit (initial): 首次提交,開始叫Git

回滾到指定版本

這裏不用checkout,繼續用上面的reset。這次把最後的HEAD^參數替換成對應的版本的md5值,只要reflog裏顯示的前幾位就好了:

$ git reset --hard 90a5288
HEAD is now at 90a5288 第二次提交,增加了哪幾期參加了git這節課

撤銷修改

修改過文件後,要先add,然後commit就提交到本地倉庫了。在commit之前是可以撤銷之前的修改的(不留痕跡)。如果commit過了,就會在倉庫中留下痕跡了,就無法真正的撤銷了。

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   "\350\257\276\347\250\213\346\227\245\346\234\237.txt"

在add之後,使用git status,根據提示的命令操作,git reset HEAD &lt;file&gt;

$ git reset HEAD 課程日期.txt
Unstaged changes after reset:
M       課程日期.txt

然後再用git status確認狀態:

$ git status
On branch 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:   "\350\257\276\347\250\213\346\227\245\346\234\237.txt"

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

上面的操作就是add的反向操作,把文件從索引拿回工作區。但是文件的內容還是之前修改後的內容,此時當然可以手動到文件裏去做修改,不過根據提示使用 git checkout -- &lt;file&gt; ,就可以撤銷文件裏修改內容:

$ git checkout -- 課程日期.txt

這裏成功沒有任何提示信息。
現在就把之前的修改完全撤銷了,並且不留痕跡。

刪除文件

從版本中刪除一個文件,要如何add呢。可以把文件刪掉,然後用提交所有的方法:

$ git add .

如果要指定文件名,就不能用add了,可以用rm:

$ git rm test.txt
rm ‘test.txt‘

命令執行後,也會同事把文件從系統中刪除。
之後還是執行一次 git commit 提交當前的版本。

遠程倉庫

首先登錄你的遠程倉庫,Github或者Gitee,創建一個項目。

創建項目

創建項目要填好項目名稱,然後第一次用,一定要把README的那個選項去掉,否則提交之後不會出現提交遠程倉庫的幫助信息:
技術分享圖片

連接遠程倉庫

根據提示,先用 git remote 連接到遠程倉庫:

$ git remote add origin https://gitee.com/<用戶名>/GitPro.git

成功的話沒有提示信息,告訴你的本地倉庫,給遠程倉庫提交的時候就往這個地址提交。
這時可以用git remote 查看已經添加的遠程倉庫信息,-v可以看詳細:

$ git remote
origin

$ git remote -v
origin  https://gitee.com/XXXXXX/GitPro.git (fetch)
origin  https://gitee.com/XXXXXX/GitPro.git (push)

提交代碼

向遠程倉庫提交代碼就用這句命令:git push origin master
現在可以提交代碼到遠程倉庫了:

$ git push -u origin master
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (10/10), 1.57 KiB | 267.00 KiB/s, done.
Total 10 (delta 2), reused 0 (delta 0)
remote: Powered by Gitee.com
To https://gitee.com/XXXXXX/GitPro.git
 * [new branch]      master -> master
Branch ‘master‘ set up to track remote branch ‘master‘ from ‘origin‘.

從現有倉庫克隆

如果本地還沒有倉庫,那麽就要先去遠程倉庫克隆一份到本地。克隆拉取到的是整個項目完整的所有歷史數據:

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

默認就是在本地創建項目名稱的同名文件夾了,也可以自定義項目名稱,把名稱放在命令後面再多一個參數:

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

拉取遠程倉庫的代碼

下載代碼,是下載當前分支的代碼。所以如果有多個分支,先確認切換到了你要的分支:

$ git pull

命令很簡單,什麽參數也沒有,就是把你當前的分支的遠程倉庫的代碼拉下來。

分支管理

略了,上次記錄的筆記裏有。

查看分支合並情況

還用用查看提交歷史的命令 git log ,加上--graph 選項,可以形象地展示了每個提交所在的分支及其分化衍合情況:

$ git log --graph

上面的命令的結果會很長,結果就不貼出來了。還可以加參數來優化,看起來更加清晰,就是每個版本的詳細信息少了。

$ git log --graph --pretty=oneline
*   8ea95936cfe5c50c6113a56b31f73bb251b17105 (HEAD -> master) Merge branch ‘alpha‘
|| * fc9e77cd8b2cc2c5426c646d35d3609dc1c48675 (alpha) alpha 分支第一次提交
* | 8f25b065e21b85502f1b3a28dacd526b5d1b55ae alpha分支建立之後,切到主分支創建了mast_alpha文件
|/
* 0166a4b396b0874555cd8a9ff40ef58f9120d281 之前提交的版本貌似文件沒有內容
* 959b03d0b8da43f7052fc3fd26172467067eef37 新加一個gitee.txt文件
* 929eeaab31f374acda4e346b229bf801c76f6a98 刪除test.txt文件
* bfcaf896defd978b3a6d119c31cb48abaa70aefe 先提交一個test.txt,測試刪除文件
* 90a52887600925e02577306510d8b7c22b1af01d 第二次提交,增加了哪幾期參加了git這節課
* 2db6c315f98fd11ef43d5114a071dca88dda238d 首次提交,開始叫Git

這個命令貌似更常用,內容也更加精簡:

$ git log --graph --oneline
*   8ea9593 (HEAD -> master) Merge branch ‘alpha‘
|| * fc9e77c (alpha) alpha 分支第一次提交
* | 8f25b06 alpha分支建立之後,切到主分支創建了mast_alpha文件
|/
* 0166a4b 之前提交的版本貌似文件沒有內容
* 959b03d 新加一個gitee.txt文件
* 929eeaa 刪除test.txt文件
* bfcaf89 先提交一個test.txt,測試刪除文件
* 90a5288 第二次提交,增加了哪幾期參加了git這節課
* 2db6c31 首次提交,開始叫Git

上面的參數 --oneline,實際上是這兩個參數的簡化用法 --pretty=oneline --abbrev-commit 。

儲藏(git stash)

當你的代碼寫到一半的時候,此時來了一個Bug,需要你立刻處理。處理Bug的話,你需要新開一個Bug分支,先在這個分支上修改代碼。但是此時,你不能直接切換分支,否則會把你未完成的代碼帶到新開的Bug分支裏去。一個做法是,先提交到一個新的分支,然後回到之前的主分支上,然後再開Bug分支。不過你可能甚至不想提交你尚未完成的代碼,此時可以用 git statsh ,先存儲你的修改。

暫存修改

我此時正在開發一個beta版,已經做了一些修改:

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

        beta.txt

nothing added to commit but untracked files present (use "git add" to track)

上面查看狀態,工作區有新的未提交的內容。此時Bug來了,我要新開一個Bug分支,但是在那之前,得先有一個幹凈的工作區。這裏用git stash來存儲:

$ git stash
No local changes to save

這裏顯示並沒有任何變化要存儲,所以並沒有把工作區的修改存儲起來。用git status查看,工作區仍然有之前未完成的修改內容。這裏需要先 git add 添加到索引區,然後再存儲:

$ git add .

$ git stash
Saved working directory and index state WIP on master: 8ea9593 Merge branch ‘alpha‘

完整的命令應該是 git stash save ,這裏save可以省掉。
此時再檢查狀態,工作區已經幹凈了:

$ git status
On branch master
nothing to commit, working tree clean

去看看文件內容,之前修改到一半的內容也都沒了。不過之後還能再拿回來

假裝做了Bug修復

現在有一個幹凈的工作區了,可以開一個處理故障的新分支了:

$ git checkout -b bug-101
Switched to a new branch ‘bug-101‘

然後隨便做些修改,假設就修復了Bug:

$ git add .
$ git commit -m "hotfix-101"
[bug-101 6fb73d5] hotfix-101
 1 file changed, 2 insertions(+), 1 deletion(-)

上面修復之後,已經沒問題了,就和master分支進行合並:

$ git checkout master
Switched to branch ‘master‘

$ git merge bug-101
Updating 8ea9593..6fb73d5
Fast-forward
 alpha.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

$ git branch -d bug-101
Deleted branch bug-101 (was 6fb73d5).

$ git branch
  alpha
* master

合並之後,順手把那個bug分支也刪掉了。

繼續之前的工作

Bug處理完了,現在可以繼續之前的做了一半的工作了,先看一下之前暫存的信息:

$ git stash list
stash@{0}: WIP on master: 8ea9593 Merge branch ‘alpha‘

取回暫存的內容:

$ git stash apply
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   beta.txt

清理暫存的數據

雖然已經那會了之前修改了一半的內容,但是你這個暫存的版本在git裏還是保留著的。可以再用 git stash list 查看確認。此時可以用下面的命令進行清理:

$ git stash drop
Dropped refs/stash@{0} (0b8311f47144c409729e197578afab0e43153b1f)

再次都要一步刪除的操作也很麻煩,可以用pop,在恢復的同時刪除:

$ git stash pop

多次stash

如果進行過多次的stash,那麽就會有多個版本。上面的命令應該是默認恢復到最近的,當然可以指定恢復到某一個。先用list查看所有暫存的版本,然後指定恢復到其中的一個:

$ git stash list
stash@{0}: WIP on master: 8ea9593 Merge branch ‘alpha‘
stash@{1}: WIP on master: 8ea9593 Merge branch ‘alpha‘
stash@{2}: WIP on master: 8ea9593 Merge branch ‘alpha‘

$ git stash apply stash@{1}

忽略特殊文件

有些時候,你必須把某些文件放到Git工作目錄中,但又不能提交它們。這時候可以配置一個特殊的.gitignore文件。
忽略文件的原則是:

  • 忽略操作系統自動生成的文件,比如縮略圖等
  • 忽略編譯生成的中間文件、可執行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫,比如Java編譯產生的.class文件
  • 忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件

依然很煩,GitHub已經為我們準備了各種配置文件,只需要組合一下就可以使用了。
這裏是python的:https://github.com/github/gitignore/blob/master/Python.gitignore

最後把.gitignore文件也提交到Git就可以了,位置就放在你項目的更目錄下面。既然你的.gitignore文件也在git裏面,自然也能給這個文件做版本管理。

全局的忽略文件

另外還可以寫一個全局忽略的文件列表,然後把你文件的路徑寫到你全局的配置文件裏:

git config --global core.excludesfile ~/.gitignore

你可以用下面的命令,查看你全局的配置文件的內容:

$ git config --global core.excludesfile
~/.gitignore

順便你還可以用這些命令,查看你的各種配置:

$ git config --system --list
$ git config --global --list
$ git config --local --list
$ git config --list

強制添加

如果文件被忽略了,在用 git status 查看狀態的時候,就不會看到這個文件了。但是如果這個文件又需要被提交,但是不想去修改配置,可以用下面的命令,強制添加原本被忽略的文件:

$ git status
On branch master
nothing to commit, working tree clean

$ git add -f .idea

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   ignor.txt

因為我做了配置,忽略ignor.*的文件,所以該文件在檢查狀態的時候被忽略了。然後將這個文件進行強制添加,這裏如果不帶-f參數,只是指定文件名的話,是會提示錯誤,提示你加上-f參數。加上-f參數就可以完成add,然後commit和之前是一樣的。

檢查忽略規則

檢查在你的規則中,具體是哪一條把文件忽略了:

$ git check-ignore -v ignor.txt
.gitignore:4:ignor.*    ignor.txt

這個方法可以幫你找出來,自己的規則哪裏寫錯了。

Pull Request

這個主要是在給別人的項目貢獻代碼的時候要用到的,大概也沒啥機會會用到,隨便記下步驟好了。
首先要fork這個項目,這是在你沒有項目的push權限的情況下,貢獻代碼的另外一種方式。請求倉庫擁有者拉自己的代碼,所以不需要有倉庫的權限。
fork之後,就可以在自己的賬號下看到這個項目了。一定要從自己的賬號下clone倉庫,因為你改了之後無法提交到別人的項目裏去(沒有push權限)。
修改之後,就是給倉庫的擁有者發pull request,最後由對方決定是不是要用你的代碼。
小結,大致就是下面的步驟:

  • 在GitHub上,可以任意Fork開源倉庫
  • 自己擁有Fork後的倉庫的讀寫權限
  • 可以推送pull request給官方倉庫來貢獻代碼。

Git 快速入門