github經常使用命令集合

建立版本庫

mkdir learngit
cd learngit
pwd

pwd命令用於顯示當前目錄,在個人電腦中,這個倉庫位於/users/michael/learngit
如果window系統,爲了不遇到各類莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文git

倉庫初始化

git init

經過這個命令把目錄變成git能夠管理的倉庫
若是你沒有看到.git目錄,那是由於這個目錄默認是隱藏的,用ls -ah命令就能夠看見。github

文件添加到暫存區

git add <file>

把文件添加到暫存區安全

提交到版本庫

git commit -m "message"

簡單解釋一下git commit命令,-m後面輸入的是本次提交的說明,能夠輸入任意內容,固然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。app

執行後輸出:ssh

$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

git commit命令執行成功後會告訴你,1 file changed:1個文件被改動(咱們新添加的readme.txt文件);2 insertions:插入了兩行內容(readme.txt有兩行內容)學習

git status

clipboard.png
git status命令可讓咱們時刻掌握暫存區當前的狀態,上面的命令輸出告訴咱們,readme.txt被修改過了,但尚未準備提交的修改。fetch

git diff

git diff顧名思義就是查看difference,知道了對readme.txt做了什麼修改後,再把它提交到倉庫就放心多了,提交修改和提交新文件是同樣的兩步ui

git log

git log命令顯示從最近到最遠的提交日誌,咱們能夠看到3次提交,最近的一次是append GPL,上一次是add distributed,最先的一次是wrote a readme filethis

clipboard.png
若是嫌輸出信息太多,看得眼花繚亂的,能夠試試加上--pretty=oneline參數url

clipboard.png
你看到的一大串相似1094adb...的是commit id(版本號)

git reset --hard HEAD^

回退到上一個版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^
最新的那個版本add disbributed已經看不到了!比如你從21世紀坐時光穿梭機來到了19世紀,想再回去已經回不去了,腫麼辦?

辦法其實仍是有的,只要上面的命令行窗口尚未被關掉,你就能夠順着往上找啊找啊,找到那個add disbributed的commit id是 2bfef3b...,因而就能夠指定回到將來的某個版本:

clipboard.png

git reflog

查找每一次命令的記錄

git checkout -- file

前提,尚未git add到暫存區,撤銷修改就回到和版本庫如出一轍的狀態

git reset HEAD <file>
git checkout -- file

已提交到暫存區,需經過以上命令撤銷修改

刪除

rm test.txt

在本地刪除文件

git status

查看狀態

clipboard.png

git rm test.txt

把版本庫中的test.txt刪除

刪除錯誤,恢復

git checkout -- file

git checkout實際上是用版本庫裏的版本替換工做區的版本,不管工做區是修改仍是刪除,均可以「一鍵還原」
注意:歷來沒有被添加到版本庫就被刪除的文件,是沒法恢復的!

遠程倉庫

1.建立SSH Key

ssh-keygen -t rsa -C "youre-mail@qq.com"

若是一切順利的話,能夠在用戶主目錄裏找到.ssh目錄,裏面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,能夠放心地告訴任何人。

2.登陸github,打開「Account settings」,「SSH Keys」頁面,而後,點「Add SSH Key」,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容

clipboard.png

clipboard.png
爲何GitHub須要SSH Key呢?由於GitHub須要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,因此,GitHub只要知道了你的公鑰,就能夠確認只有你本身才能推送。

3.在Repository name填入learngit,其餘保持默認設置,點擊「Create repository」按鈕,就成功地建立了一個新的Git倉庫

clipboard.png

咱們根據GitHub的提示,在本地的learngit倉庫下運行命令

git remote add origin git@github.com:michaelliao/learngit.git

請千萬注意,把上面的michaelliao替換成你本身的GitHub帳戶名,添加後,遠程庫的名字就是origin,這是Git默認的叫法,也能夠改爲別的,可是origin這個名字一看就知道是遠程庫

git push -u origin master

因爲遠程庫是空的,咱們第一次推送master分支時,加上了-u參數

clipboard.png

推送成功後,能夠馬上在GitHub頁面中看到遠程庫的內容已經和本地如出一轍:

clipboard.png

從如今起,只要本地做了提交,就能夠經過命令

git push origin master

先建設遠程庫,再建設本地庫

首先,登錄GitHub,建立一個新的倉庫,名字叫gitskills:

clipboard.png

咱們勾選Initialize this repository with a README,這樣GitHub會自動爲咱們建立一個README.md文件。建立完畢後,能夠看到README.md文件:

clipboard.png

如今,遠程庫已經準備好了,下一步是用命令git clone克隆一個本地庫:

git clone git@github.com:michaelliao/gitskills.git

注意把Git庫的地址換成你本身的,而後進入gitskills目錄看看,已經有README.md文件了:

$ cd gitskills
$ ls
README.md

很是重要的分支管理

分支就是科幻電影裏面的平行宇宙,當你正在電腦前努力學習Git的時候,另外一個你正在另外一個平行宇宙裏努力學習SVN。
若是兩個平行宇宙互不干擾,那對如今的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,結果,你既學會了Git又學會了SVN!

clipboard.png

git checkout -b dev

建立dev分支,而後切換到dev分支
git checkout命令加上-b參數表示建立並切換,至關於如下兩條命令:

git branch dev
git checkout dev
Switched to branch 'dev'

查看當前分支

git branch

切換分支

git checkout master

刪除分支

git branch -d dev

當有衝突的時候,修改衝突,選擇要保留下來的語句,而後git add 和 git commit.

clipboard.png
查看一下readme.txt中的內容

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容,咱們修改以下後保存:

Creating a new branch is quick and simple.

在普通模式下合併分支

git merge --no-ff -m "merge with no-ff" dev

由於本次合併要建立一個新的commit,因此加上-m參數,把commit也加進去
Git分支十分強大,在團隊開發中應該充分應用。
合併分支時,加上--no-ff參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward合併就看不出來曾經作過合併

Git還提供了一個stash功能,能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做

git stash

git查看工做現場列表

git stash list

恢復stash且把stash內容刪除

git stash pop

至關於

git stash apply //恢復
git stash drop  //刪除

強行刪除分支

git branch -D <branch name>

查看遠程庫信息:

git remote -v

如果有一個小夥伴要與你在相同分支下開發,這時,你開發完成後,他也開發完成,大家修改了同個地方,這時候就會衝突,你要先把它拉取下來:

git pull

這時候有可能出現拉取失敗並提示:

clipboard.png

git pull也失敗了,緣由是沒有指定本地dev分支與遠程origin/dev分支的連接,根據提示,設置dev和origin/dev的連接:

git branch --set-upstream-to=origin/dev dev

再pull:

git pull

把分叉的提交歷史「整理」成一條直線,看上去更直觀

git rebase

標籤管理

發版本的時候,這個版本會有一個tag,這個tag對應的是某一個commit-id,可是有了commit-id爲何還要有tag,緣由是commit-id太長太冗餘,是一串長長的數字,如有某個tag例如v1.2,簡短好識別

新建標籤:

git tag <name>

查看全部標籤:

git tag

爲特定的commit打上標籤:

git tag v0.9 f52c633

查看標籤信息:

git show <tagname>

clipboard.png

還能夠建立帶有說明的標籤,用-a指定標籤名,-m指定說明文字

git tag -a v0.1 -m "version 0.1 released" 1094adb

若是標籤打錯了,還能夠刪除

git tag -d v0.1

由於建立的標籤都只存儲在本地,不會自動推送到遠程。因此,打錯的標籤能夠在本地安全刪除。

若是要推送某個標籤到遠程,使用命令

git push origin <tagname>

一次性推送所有還沒有推送到遠程的本地標籤:

git push origin --tag

若是標籤已經推送到遠程,要刪除遠程標籤就麻煩一點,先從本地刪除:

git tag -d v0.1
git push origin :refs/tags/v0.9

同時使用github和gitee

要創建兩個遠程庫,咱們能夠刪除已有的GitHub遠程庫:

git remote rm origin

關聯碼雲的遠程庫:

git remote add gitee git@gitee.com:liaoxuefeng/learngit.git

再關聯github的遠程庫

git remote add github git@github.com:michaelliao/learngit.git

如今,咱們用git remote -v查看遠程庫信息,能夠看到兩個遠程庫

git remote -v
gitee    git@gitee.com:liaoxuefeng/learngit.git (fetch)
gitee    git@gitee.com:liaoxuefeng/learngit.git (push)
github    git@github.com:michaelliao/learngit.git (fetch)
github    git@github.com:michaelliao/learngit.git (push)碼

若是要推送到GitHub,使用命令:

git push github master

若是要推送到碼雲,使用命令:

git push gitee master

配置別名

若是敲git st就表示git status那就簡單多了,固然這種偷懶的辦法咱們是極力同意的。
咱們只須要敲一行命令,告訴Git,之後st就表示status:

git config --global alias.st status

固然還有別的命令能夠簡寫,不少人都用co表示checkout,ci表示commit,br表示branch:

git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch

配置輸出log的優質顯示

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

配置Git的時候,加上--global是針對當前用戶起做用的,若是不加,那隻針對當前的倉庫起做用。
配置文件放哪了?每一個倉庫的Git配置文件都放在.git/config文件中:

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = git@github.com:michaelliao/learngit.git    
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[alias]
    last = log -1

別名就在[alias]後面,要刪除別名,直接把對應的行刪掉便可。

此文章參考:廖雪峯老師的git教程,歡迎你們前往查看

相關文章
相關標籤/搜索