Git是一個分佈式的文件版本控制系統,每一個電腦都有一個完整的文件庫和版本庫,文件庫之間能夠互相推送和抓取版本信息。CVS和SVN是集中式的文件版本控制系統,文件庫和版本信息集中存放在服務器上,每一個電腦只跟服務器交互信息。html
1. Git的安裝git
操做系統:Ubuntu 12.04LTSgithub
Git的安裝命令: sudo apt-get install git編程
2. Git的配置vim
2.1. 設置Git的配置服務器
--local option: read and write from .git/config 編程語言
配置信息的做用域爲當前庫,配置信息存放在.git/config。編輯器
--global option: read and write from ~/.gitconfig. 分佈式
配置信息的做用域爲當前用戶,配置信息存放在~/.gitconfig。工具
--system option: read and write from /etc/gitconfig, that contains value for every user.
配置信息的做用域爲整個系統的全部用戶,配置信息存放在/etc/gitconfig。
2.1.1 設置用戶名
git config --global user.name "user name"
2.1.2 設置用戶的郵箱
git config --global user.email "user email"
2.1.3 設置文本編輯器(editor)
git config --global core.editor vim
2.1.4 設置文本比較工具和合並工具(Diff Tool, Merge Tool)
git config --global diff.tool vimdiff
git config --global merge.tool vimdiff
2.1.5 彩色顯示git命令的輸出
git config --global color.ui true
2.2. 設置Git命令的簡寫,相似於C語言裏面的宏命令
2.2.1 設置經常使用命令的簡寫
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.cm commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
2.2.1 設置複雜命令的簡寫,例如建立一個複雜的顯示日誌信息的命令lg
$ 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"
2.3. 設置不進行版本控制的文件類型列表
若是不想對有些類型的文件進行版本控制,例如編譯過程當中產生的臨時文件或中間文件等,能夠建立Git的忽略文件列表.gitignore,將不須要進行版本控制的文件類型加入到列表中。Git將自動地忽略工做區中的這些類型的文件,不進行跟蹤和版本管理。github的網站上有各類類型編程語言的忽略類型列表的模版,網址爲https://github.com/github/gitignore。
個人.gitignore內容以下:
# Python:
*.py[cod] # *.pyc, *.pyo, *.pyd
# Tex:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.dvi # Tex Intermediate documents:
*.bbl # Tex Bibliography auxiliary files (bibtex/biblatex/biber):
*.bcf
*.blg
#Vim
*.swp
3. Git的本地庫操做(Local Repository)
3.1. 建立本地文件倉庫: git init
git init把當前文件夾建立爲一個本地文件倉庫Repository,其中包括兩部分:工做目錄(Working Directory)和版本庫(.git).
工做目錄就是當前的文件夾,包括其中的全部文件,但不包括.git文件夾,也不包括.gitignore中列出的文件;
版本庫存儲在.git文件夾中,.git是一個隱藏文件夾,其中記錄了工做目錄中文件的各個版本信息。
3.2. 把文件的修改提交到本地庫:git add ; git commit
提交文件修改到本地庫有兩個步驟:
3.2.1 git add file_name, 提交文件的修改到暫存區(staging area or index)。
暫存區中能夠存放多個文件的修改信息和一個文件的屢次修改信息。
3.2.2 git commit -m "comments",將暫存區的修改生成一個新的版本(commit),並清空暫存區。
-a option will let you skip the git add part. -a可使工做區的修改直接提交成新的版本,再也不通過暫存區。
3.3 查看本地庫的文件狀態。
git status(to check the status. '-s' option will give the short output.)能夠查看工做區中文件的狀態, 其輸出內容包括4個部分:
1. 當前工做目錄所在的分支,例如「on branch master」表示當前工做目錄在正在名爲master的分支。
2. 已經提交到暫存區(staging area)的修改(Changes to be committed)
3. 未提交到暫存區的修改(Changes not staged for commit)
2. 在工做目錄中,可是未進行版本控制的文件(Untracked files)
圖1. 文件在Git版本控制過程當中的狀態週期
fig1. File Status Lifecycle
3.4 查看文件的修改信息
git diff能夠查看一個文件的內容修改,包括如下3種修改信息:
3.4.1 工做區文件相對於版本庫的修改內容
git diff HEAD [filename] // Changes in the working tree since your last commit.
3.4.2 工做區文件相對於暫存區的修改內容。
git diff [filename] // Changes in the working tree not yet staged for the next commit.
3.4.3 暫存區相對於版本庫的修改內容
git diff --cached [filename] // Changes between the index and your last commit
3.4.4 版本庫的不一樣版本之間的修改內容
git diff commit_id1 commit_id2 [filename] // compare between two different commits
**git difftool可使用指定的文本比較軟件進行文件比較,例如vimdiff。difftool的設置在2.1.4小節,使用git config --global diff.tool vimdiff。
**能夠設置difftool的簡寫爲d,例如git config --global alias.d difftool。這樣,使用git difftool ...時能夠直接使用 git d ...
3.5 撤銷文件內容的修改
3.5.1 撤銷工做區的修改(to discard changes in the working directory)
git checkout --filename 將工做區的文件恢復到最近一次提交到暫存區中的版本或者提交到版本庫中的版本。
3.5.2 撤銷暫存區的修改
git reset HEAD filename 能夠把暫存區的修改撤銷掉(unstage)
3.5.3 撤銷版本庫的修改(版本庫的回退)
git reset --hard HEAD^ //回退到前一個版本。
git reset --hard commit_id // 回退到以前指定的一個版本。
git log // 查看版本的提交記錄,以選擇回退到以前哪一個版本。
git reflog // 查看命令歷史,能夠查詢有哪一個版本回退到當前的版本。
3.6 刪除文件
3.5.1 從版本庫和硬盤上同時刪除文件 git rm filename
to remove files from the staging area entirely and also off the disk.
3.5.2 只從版本庫中刪除文件,工做區中還保留文件 git rm --cached filename
--cached option leaves the file in the working dictionary but not have Git track it anymore.
3.5.3 強制刪除文件 git rm -f filename
-f option: if you modified the file and added it to the index already, you must force the removal with the -f option.
若是文件的修改已經被提交到暫存區,就須要使用強制刪除文件。
3.5.4 刪除文件夾 git rm -r dir
-r option: remove recursively
3.5.5 恢復被刪除的文件 git checkout -- filename
與撤銷工做區的修改相似,使用git checkout 命令能夠從版本庫中恢復被刪除的文件。
4. Git的分支(Branches)
我我的認爲Git的分支和暫存區是理解Git工做過程的兩個重點。版本庫中的每一個版本能夠按照其提交時間排列到一個時間軸上。分支能夠理解成一個項目被分爲不一樣的部分同時開發,每個並行開發的部分就是一個分支。開發過程當中,分支能夠合併,也能夠產生新的子分支。Git的分支是指向時間軸上版本的指針,而HEAD是一個指向分支的指針。被HEAD指向的分支是當前的工做分支,每一個本地庫只有一個當前工做分支。
4.1 查看分支:git branch
4.1.1 查看本地分支 git branch
分支列表中,有*標記的爲當前工做分支。
4.1.2 查看遠程分支 git branch -r
to list remote-tracking branches
4.2 建立分支:git branch name
一般,master分支是項目的主分支,文件的修改不會在主分支上進行,而是建立一個dev分支爲當前工做分支。dev分支的版本完成後,才把dev分支合併到master分支。
建立的新分支指向的版本是當前工做分支指向的版本。
4.3 切換分支:git checkout name
將當前的工做分支切換到指定的分支上。git checkout 命令還能夠用於恢復工做區文件的修改,恢復工做區被刪除的文件。
建立並切換分支:git checkout -b name
4.4 合併某分支到當前分支:git merge name
若是合併時出現衝突,須要手工解決不一樣分支的差別,而後再從新提交。
4.5 刪除分支:git branch -d name
4.6 查看分支信息:git branch
to list local-working branches. git branch只列出本地的工做分支
git branch -a 能夠列出本地和遠程的所有分支
to list all branches including local-working and remote-tracking branches.
5. Git的遠程庫操做(Remote Repository)
5.1 克隆一個遠程庫到本地
git clone remote_url [local_dir] 複製遠程的Git代碼庫到本地文件夾。
get a local copy of a remote Git repository so you can look at it and start modifying it.
clone命令能夠把一個遠程的Git代碼庫複製到本地,包括history, 這樣就能夠查看裏面的內容或者進行修改。若是指定了本地目錄local_dir,就將Git庫中的內容存入local_dir。若是沒有指定本地目錄,就創建與Git庫名稱相同的本地目錄,而後將內容存進目錄中。
5.2 將本地庫與遠程庫創建關聯
git remote add [short name] [url] 將遠程庫與本地庫創建關聯。
to add a new remote Git repository as a short name you can reference easily.
5.3 向遠程庫推送信息
git push [remote-name] [branch-name] 將當前的工做分支(branch)推送到遠程庫。
to push your work (branch name) back up to the server (remote name)
5.4 從遠程庫抓取信息
5.4.1 git fetch [remote-name] 獲取遠程庫的更新,不與本地的文件合併。
to get data from the specified remote Git repository.
Note that fetch command doesn't automatically merge files with any of your work or modify what you're currently working on. You have to merge it manually into your work.
僅下載指定的遠程庫的更新,遠程庫的更新與本地文件的合併須要手工完成,不會直接覆蓋本地文件。
5.4.2 git pull [remote-name] 抓取遠程庫的更新,並嘗試與本地文件進行合併
to automatically fetch and then merge a remote branch into your current branch.??
5.5 查看遠程庫的信息
git remote 列出遠程庫的名稱
to list all short names of each remote handle you've specified.
"origin" is the default name Git gives to the server you cloned from.
克隆的遠程代碼倉庫的默認名稱爲origin
git remote -v shows the short names of remote handles and their URL.
git remote -v 命令不只列出代碼倉庫的名稱,並且列出其對應的URL
git remote show remote-name
to list the URL for the remote repository as well as the tracking branch information.
5.6 修改遠程庫的名稱
git remote rename [remote-name] [remote-new-name]
to change a remote repository's short name. Note that this changes your remote branch names too.
5.7 刪除與遠程庫的關聯
git remote rm [remote-name]
to remove the reference to a remote repository.
5.8 顯示遠程庫的版本信息
git ls-remote origin
show the references in a remote repository and their hash
6. Git的標籤(Tags)
Force Git to overwrite local files on pull
強制覆蓋本地文件
git reset --hard HEAD
git clean -f -d
git pull
或者使用fetch命令
git fetch --all
git reset --hard origin/master
Explanation:
git fetch downloads the latest from remote without trying to merge or rebase anything.
Then the git reset resets the master branch to what you just fetched. The --hard option changes all the files in your working tree to match the files in origin/master, so if you have any local changes, they will be lost. With or without --hard, any local commits that haven't been pushed will be lost.