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 <file>
:
$ 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 -- <file>
,就可以撤銷文件裏修改內容:
$ 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 快速入門