------- GIT安裝 ------- 1.linux安裝git sudo apt-get install git 老一點: sudo apt-get install git-core 2.maxOS安裝git brew install git 3.windows安裝git msysgit是Windows版的Git,從http://msysgit.github.io/下載,而後按默認選項安裝便可。安裝完成後,在開始 菜單裏找到「Git」->「Git Bash」,蹦出一個相似命令行窗口的東西,就說明Git安裝成功! 安裝完成後,還須要最後一步設置,在命令行輸入: $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" --------- 建立版本庫 --------- 1.建立版本庫--版本庫增長文件 ".git" 文件 $ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit 把上面目錄變成版本庫 $ git init Initialized empty Git repository in /Users/michael/learngit/.git/ 2. 初始化一個Git倉庫,使用git init命令。 添加文件到Git倉庫,分兩步: 第一步,使用命令git add <file>,注意,可反覆屢次使用,添加多個文件; 第二步,使用命令git commit,完成。 ------------------ 3.查看當前版本庫狀態--git status 若是隻修改了沒有git add git status尾行顯示--no changes added to commit (use "git add" and/or "git commit -a") 若是隻git add了 沒有git commit git status第二行顯示--Changes to be committed 若是第一次提交的文件沒有被git add會顯示 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: readme.txt Untracked files: (use "git add <file>..." to include in what will be committed) LICENSE **************上面代碼表示readme.txt文件被修改了,LICENSE歷來沒被添加過****************** ------- 版本回退 ------- 1.git log命令顯示從最近到最遠的提交日誌,重要參數 --pretty=oneline 2.git回退版本(回到過去) 在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,固然往上100個版本寫100個^ 比較容易數不過來,因此寫成HEAD~100 $ git reset --hard HEAD^ $ git reset --hard 3628164 回到過去的版本 3.git回到將來版本(回到將來) git reflog 記錄了你每一次git命令 能夠用這個回到將來的版本 4.如今總結一下: HEAD指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,git reset --hard commit_id。 穿梭前,用git log能夠查看提交歷史,以便肯定要回退到哪一個版本。 要重返將來,用git reflog查看命令歷史,以便肯定要回到將來的哪一個版本。 ------------ 工做區和暫存區 ------------ 1.工做區--本身本地分支的東西 2.暫存區--git add以後咱們認爲把代碼提交到了暫存區 ---------- git管理修改 ---------- 1.放棄工做區的修改 git checkout -- readme.txt 一種是readme.txt自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態; 一種是readme.txt已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。 總之,就是讓這個文件回到最近一次git commit或git add時的狀態。 $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: readme.txt git reset HEAD readme.txt 能夠把暫存區的修改撤銷掉(unstage),工做區從新變成git add以前的狀態 2.git管理小結 git checkout -- readme.txt 放棄工做區的修改 git reset HEAD readme.txt 放棄緩存區的修改回到git add以前的狀態 ------- 刪除文件 ------- 1.$ rm test.txt # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) deleted: test.txt rm 直接刪除是刪除工做區中的文件 a.若是你的目的是把版本庫中的也刪除,須要git add 而後git commit操做 b.若是你以爲刪錯了還能夠用 git checkout -- test.txt,把該文件從版本庫中找回來 2.小結 命令git rm用於刪除一個文件。若是一個文件已經被提交到版本庫,那麼你永遠不用擔憂誤刪,可是要當心,你只能恢 覆文件到最新版本,你會丟失最近一次提交後你修改的內容。 ---------- 創建遠程倉庫 ---------- 1.創建遠程倉庫 a.建立SSH Key。 在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看這個目錄下有沒有id_rsa和id_rsa.pub 這兩個文件,若是已經有了,可直接跳到下一步。若是沒有,打開Shell(Windows下打開Git Bash). 建立SSH Key:ssh-keygen -t rsa -C "youremail@example.com" b.登錄GitHub,打開「Account settings」,「SSH Keys」頁面: 而後,點「Add SSH Key」,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容: 另外一個辦法是本身動手,搭一個Git服務器,由於是你本身的Git服務器,因此別人也是看不見的。 c.從github創建遠程分支 把git地址記住 touch README.md //新建一個記錄提交操做的文檔 git init //初始化本地倉庫 git add README.md //添加 git commit -m "first commit"//提交到要地倉庫,並寫一些註釋 git remote add origin git@github.com:youname/Test.git //鏈接遠程倉庫並建了一個名叫:origin git push -u origin master //將本地倉庫的東西提交到地址是origin的地址,master分支下 2.github問題 /**LINUX命令複習**/ //刪除當前文件夾下的全部 name含有.svn 文件 find . -name ".svn" | xargs rm -Rf //刪除當前文件夾下的全部 name含有.git 文件 find . -name ".git" | xargs rm -Rf /**LINUX命令複習**/ 若是輸入$ git remote add origin git@github.com:djqiang(github賬號名)/gitdemo(項目名).git 提示出錯信息:fatal: remote origin already exists. 解決辦法以下: a、先輸入$ git remote rm origin b、再輸入$ git remote add origin git@github.com:djqiang/gitdemo.git 就不會報錯了! c、若是輸入$ git remote rm origin 仍是報錯的話, error: Could not remove config section 'remote.origin'. 咱們須要修改gitconfig文件的內容 d、找到你的github的安裝路徑, 個人是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_ca477551eeb4a6720bb5c8\etc e、找到一個名爲gitconfig的文件,打開它把裏面的[remote "origin"]那一行刪掉就行了! 若是輸入$ ssh -T git@github.com 出現錯誤提示:Permission denied (publickey).由於新生成的key不能加入ssh就會致使鏈接不上github。 解決辦法以下: a、先輸入$ ssh-agent,再輸入$ ssh-add ~/.ssh/id_key,這樣就能夠了。 b、若是仍是不行的話,輸入ssh-add ~/.ssh/id_key 命令後 出現報錯Could not open a connection to your authentication agent.解決方法是key用Git Gui 的ssh工具生成,這樣生成的時候key就直接保存在ssh中了,不須要再ssh-add命令加入了,其它的user,token 等配置都用命令行來作。 c、最好檢查一下在你複製id_rsa.pub文件的內容時有沒有產生多餘的空格或空行,有些編輯器會幫你添加這些的。 若是輸入$ git push origin master 提示出錯信息:error:failed to push som refs to ....... 解決辦法以下: a、先輸入$ git pull origin master //先把遠程服務器github上面的文件拉下來 b、再輸入$ git push origin master c、若是出現報錯 fatal: Couldn't find remote ref master 或者 fatal: 'origin' does not appear to be a git repository 以及 fatal: Could not read from remote repository. d、則須要從新輸入$ git remote add origingit@github.com:djqiang/gitdemo.git ----------- 添加遠程倉庫 ----------- 要關聯一個遠程庫,使用命令git remote add origin git@server-name:path/repo-name.git; 關聯後,使用命令git push -u origin master第一次推送master分支的全部內容; 此後,每次本地提交後,只要有必要,就可使用命令git push origin master推送最新修改; ------------ 從遠程倉庫克隆 ------------ $ git clone git@github.com:michaelliao/gitskills.git Git支持多種協議,默認的git://使用ssh,但也可使用https等其餘協議。 使用https除了速度慢之外,每次推送都必須輸入口令,可是在某些只開放http端口的公司內部就沒法使用ssh協議 而只能用https。 ------------ 建立與合併分支 ------------ Git鼓勵大量使用分支: 查看分支:git branch 建立分支:git branch <name> 切換分支:git checkout <name> 建立+切換分支:git checkout -b <name> 合併某分支到當前分支:git merge <name> 刪除分支:git branch -d <name> ------- 解決衝突 ------- $ git log --graph --pretty=oneline --abbrev-commit 分支合併圖 ---------- 分支管理策略️ ---------- 主分支 master 最乾淨的一個分支不在此分支上作任何操做 開發分支 dev 開發人員主要工做的分支,用來作週期開發,快速迭代開發 修改bug fixbug 修改bug的一個分支 ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐很是重要的一章--開始⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐ --------- fixbug分支 --------- 應用場景 你須要修改一個master(線上)分支的一個很緊急的bug,這個bug須要在1小時內解決,dev分支的功能開發到一半還 須要很長時間(遠遠大於1小時),這個時候你須要怎麼作呢? 你能夠這樣來作: git checkout -b fixbug 而後修改bug(如今是在最新從master檢出的fixbug分支上修改bug)---修改完成 git add ./ git commit -m '修改***的bug' git checkout dev $ git stash # Saved working directory and index state WIP on dev: 6224937 add merge # HEAD is now at 6224937 add merge git status # From developer.playcrab.com:zhaoqiang/luck_draw # * branch dev -> FETCH_HEAD # Already up-to-date. git merge fixbug --no-ff -m '修改***的bug後,合併fixbug分支的內容到dev' 工做現場還在,Git把stash內容存在某個地方了,可是須要恢復一下,有兩個辦法: 一是用git stash apply恢復,可是恢復後,stash內容並不刪除,你須要用git stash drop來刪除; 另外一種方式是用git stash pop,恢復的同時把stash內容也刪了 你能夠屢次stash,恢復的時候,先用git stash list查看,而後恢復指定的stash,用命令: $ git stash apply stash@{0} git stash pop (這時候你再用git stash list來查看暫存的東西) git checkout master git merge fixbug --no-ff -m '修改***的bug後,合併fixbug分支的內容到dev' 而後刪除fixbug分支 git branch -d fixbug (-d銷燬fixbug分支 -D強制銷燬) 這樣作是爲了之後dev分支開發完以後和master分支合併的時候不衝突 ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐很是重要的一章--結束⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐ ------- 多人協做 ------- 1.當你使用git clone 從遠程分支克隆的時候,本地master分支和遠程的master分支會自動對應起來,且遠程倉庫的默認 名稱默認爲origin 查看遠程庫的分支git remote 或者詳細信息 git remote -v origin git@github.com:michaelliao/learngit.git (fetch) origin git@github.com:michaelliao/learngit.git (push) 把本地分支推送到遠程分支 git push origin 分支名稱(本地分支名稱通常和遠程分支名稱是一致的) # Please specify which branch you want to merge with. # See git-pull(1) for details # git pull <remote> <branch> # If you wish to set tracking information for this branch you can do so with: # git branch --set-upstream dev origin/<branch> 上面是git pull 失敗 須要的步驟 設置dev和origin/dev的連接: $ git branch --set-upstream dev origin/dev 2.多人協做步驟 所以,多人協做的工做模式一般是這樣: q.首先,能夠試圖用git push origin branch-name推送本身的修改; b.若是推送失敗,則由於遠程分支比你的本地更新,須要先用git pull試圖合併; c.若是合併有衝突,則解決衝突,並在本地提交; d.沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功! e.若是git pull提示「no tracking information」,則說明本地分支和遠程分支的連接關係沒有建立, 用命令git branch --set-upstream branch-name origin/branch-name。 這就是多人協做的工做模式,一旦熟悉了,就很是簡單。 ------- 標籤管理 ------- 1.git打標籤 切換到須要打標籤的分支 git tag v1.0 或者 git tag -a <tagname> -m "blablabla..." 指定標籤備註的標籤 查看全部標籤 git tag 查看標籤信息 git show v1.0 2.git標籤操做 刪除標籤 $ git tag -d v1.0 推送本地標籤到遠程 git push origin <tagname> 例如 git push origin v1.0 一次推送本地全部未能推送到遠程的標籤 $ git push origin --tags 若是標籤已經推送到遠程,要刪除遠程標籤就麻煩一點,先從本地刪除: $ git tag -d v0.9 # Deleted tag 'v0.9' (was 6224937) $ git push origin :refs/tags/v0.9 # To git@github.com:michaelliao/learngit.git # - [deleted] v0.9 -------- 自定義git -------- 1.讓Git顯示顏色,會讓命令輸出看起來更醒目: $ git config --global color.ui true 2.配置快捷鍵 $ git config --global alias.st status (git status = git st) $ git config --global alias.co checkout(git checkout = git co) $ git config --global alias.ci commit (git commit = git ci) $ git config --global alias.br branch (git branch = git br) 怎麼刪除git配置文件的快捷鍵 只須要到用戶主目錄找到.gitconfig 文件 把對應的行刪除就好了 cd ~/ 或者 git config --global --unset alias.st 查看配置別名 git config --list | grep alias git config --get-regexp alias ------------ 搭建git服務器 ------------ 前提 搭建Git服務器須要準備一臺運行Linux的機器,強烈推薦用Ubuntu或Debian,這樣,經過幾條簡單的apt命令就可 以完成安裝。 第一步 安裝git服務 $ sudo apt-get install git 第二步,建立一個git用戶,用來運行git服務: $ sudo adduser git 第三步,建立證書登陸: 收集全部須要登陸的用戶的公鑰,就是他們本身的id_rsa.pub文件,把全部公鑰導入到: /home/git/.ssh/authorized_keys文件裏,一行一個。 第四步,初始化Git倉庫: 先選定一個目錄做爲Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令: $ sudo git init --bare sample.git Git就會建立一個裸倉庫,裸倉庫沒有工做區,由於服務器上的Git倉庫純粹是爲了共享,因此不讓用戶直接登陸到服 務器上去改工做區,而且服務器上的Git倉庫一般都以.git結尾。而後,把owner改成git: $ sudo chown -R git:git sample.git 第五步,禁用shell登陸: 出於安全考慮,第二步建立的git用戶不容許登陸shell,這能夠經過編輯/etc/passwd文件完成。找到相似下面的一行: git:x:1001:1001:,,,:/home/git:/bin/bash 改成 git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell 這樣,git用戶能夠正常經過ssh使用git,但沒法登陸shell,由於咱們爲git用戶指定的git-shell每次一登陸就 自動退出。 第六步,如今,能夠經過git clone命令克隆遠程倉庫了,在各自的電腦上運行: $ git clone git@server:/srv/sample.git 這裏咱們不介紹怎麼玩Gitosis了,幾百號人的團隊基本都在500強了,相信找個高水平的Linux管理員問題不大。