騰訊課堂python
git是一個分佈式的版本控制軟件。版本控制是一種記錄一個或若干文件內容變化,以便未來查閱特定版本修訂狀況的系統。linux
最初由林納斯·託瓦茲創做,於2005年以GPL釋出。最初目的是為更好地管理Linux內核開發而設計。git
2005年,安德魯·垂鳩寫了一個簡單程序,能夠鏈接BitKeeper的存儲庫,BitKeeper著做權擁有者拉里·麥沃伊認爲安德魯·垂鳩對BitKeeper內部使用的協議進行逆向工程,決定收回免費使用BitKeeper的許可。Linux內核開發團隊與BitMover公司進行磋商,但沒法解決他們之間的歧見。林納斯·託瓦茲決定自行開發版本控制系統替代BitKeeper,以十天的時間,編寫出第一個git版本.github
集中化的版本控制系統(Centralized Version Control Systems
,簡稱 CVCS
)應運而生。 這類系統,諸如 CVS
、Subversion
以及 Perforce
等,都有一個單一的集中管理的服務器,保存全部文件的修訂版本,而協同工做的人們都經過客戶端連到這臺服務器,取出最新的文件或者提交更新。web
集中式管理的缺點:shell
分佈式版本控制系統(Distributed Version Control System
,簡稱 DVCS
).分佈式就是每一個人都有一份完整的倉庫版本,提交和管理都是在本地進行,固然也能夠進行遠程的倉庫之間進行合併提交等操做。windows
若是你想在 Linux 上用二進制安裝程序來安裝 Git,可使用發行版包含的基礎軟件包管理工具來安裝。 若是 以 Fedora 上爲例,你可使用 yum:ruby
$ sudo yum install git
若是你在基於 Debian 的發行版上,請嘗試用 apt-get:bash
$ sudo apt-get install git
要了解更多選擇,Git 官方網站上有在各類 Unix 風格的系統上安裝步驟,網址爲 http://git-scm.com/download/linux。服務器
方法一:
最簡單的方法是安裝 Xcode Command Line Tools
,而後在 Terminal 裏嘗試首次運行 git 命令便可。 若是沒有安裝過命令行開發者工具,將會提示 你安裝。
方法二:(推薦)
使用 homebrew
$ brew install git
直接下載安裝包:https://gitforwindows.org/
windows請從開始菜單程序中打開gitbash
,其餘系統請打開終端工具或者shell命令行工具。
$ git --version
# 輸出,僅供參考 git version 2.18.0
當安裝完 Git 應該作的第一件事就是設置你的用戶名稱與郵件地址。 這樣作很重要,由於每個 Git 的提交都會 使用這些信息,而且它會寫入到你的每一次提交中。
windows請從開始菜單程序中打開gitbash
,其餘系統請打開終端工具或者shell命令行工具。
$ git config --global user.name "aicoder" $ git config --global user.email laoma@aicoder.com
請把用戶名和郵箱換成你本身的
若是使用了 --global 選項,那麼該命令只須要運行一次,由於以後不管你在該系統上作任何事 情, Git 都會使用那些信息。 當你想針對特定項目使用不一樣的用戶名稱與郵件地址時,能夠在那個項目目錄下運 行沒有 --global 選項的命令來配置。
以上配置完成後,檢測是否配置成功:
$ git config --list
# 輸出如下內容,僅供參考 credential.helper=osxkeychain user.name=aicoder user.email=laoma@aicoder.com color.status=auto ...
Git
服務器大部分都使用 SSH
公鑰進行認證,其餘認證方式都不方便,建立SSH
公鑰的方法。
請打開用gitbash或者終端工具運行如下命令
默認狀況下,用戶的 SSH
密鑰存儲在其 ~/.ssh
目錄下。 進入該目錄並列出其中內容,你即可以快 速確認本身是否已擁有密鑰:
$ cd ~/.ssh $ ls authorized_keys2 id_dsa known_hosts config id_dsa.pub
cd命令能夠幫助咱們進入系統的某個目錄。 ls命令能夠列出當前目錄下面的全部文件和文件夾的信息。
若是已經存在id_dsa
、id_dsa.pub
,說明就已經生成果,後面的步驟能夠省略。
id_dsa 或 id_rsa 命名的文件,其中一個帶有 .pub 擴展名。 .pub 文件是你的公鑰,另 一個則是私鑰。
$ ssh-keygen
# 一路回車回車便可,如下爲輸出內容,僅供參考 Generating public/private rsa key pair. Enter file in which to save the key (/home/schacon/.ssh/id_rsa): Created directory '/home/schacon/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/schacon/.ssh/id_rsa. Your public key has been saved in /home/schacon/.ssh/id_rsa.pub. The key fingerprint is: d0:82:24:8e:d7:f1:bb:9b:33:53:96:93:49:da:9b:e3 schacon@mylaptop.local
首先 ssh-keygen 會確認密鑰的存儲位置(默認是 .ssh/id_rsa),而後它會要求你輸入兩次密鑰口令。如 果你不想在使用密鑰時輸入口令,將其留空便可。
$ cd /path/to/init $ git init
此時在目錄中將建立一個名爲 .git
的子目錄,這裏面存放當前倉庫的全部的跟蹤的信息。
此時當前文件夾下面的全部的文件都沒有被跟蹤,若是須要跟蹤變化,必須添加到跟蹤的參考中。
git add 文件
命令能夠幫祝咱們讓git幫忙跟蹤具體的文件。而後執行git commit
提交信息,至關於確認跟蹤。
$ git add ./*.js
$ git add a.txt
$ git commit -m 'first commit'
提交記錄的時候必須添加消息,並且添加的消息還有必定的規範,每一個公司的提交消息規範不同,視狀況而定。
工做區,也稱爲工做目錄,也就是要進行版本管理的文件夾。
暫時存放將要記錄修改版本的文件的區域。
工做目錄下的每個文件都不外乎這兩種狀態:已跟蹤或未跟蹤。
git add
能夠把文件加入暫存區。 git commit
命令能夠把暫存區的文件更新變化記錄到版本庫中永久保存。
不在暫存區的文件,不會被追蹤。
暫存區和版本庫存放在 .git目錄中。
要查看哪些文件處於什麼狀態,能夠用 git status 命令。 若是在克隆倉庫後當即使用此命令,會看到相似這 樣的輸出:
$ git status
如下是沒有任何修改和暫存的狀況:
On branch master
Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
如下是有修改未提交,有新增長爲加入暫存區的狀況:
On branch master
Your branch is up to date with 'origin/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: docs/pages/vip_3git.md Untracked files: (use "git add <file>..." to include in what will be committed) docs/images/0.jpeg docs/images/zc.png no changes added to commit (use "git add" and/or "git commit -a")
git status
命令的輸出十分詳細,但其用語有些繁瑣。 若是你使用 git status -s
命令或 git status --short
命令,你將獲得一種更爲緊湊的格式輸出。運行git status -s
,狀態報告輸出以下:
$ git status -s M README MM Rakefile A lib/git.rb M lib/simplegit.rb ?? LICENSE.txt
git log
命令幫助咱們輸出git的全部操做日誌。
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test commit a11bef06a3f659402fe7563abf99ad00de2209e6 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 10:31:28 2008 -0700 first commit
按q鍵能夠退出查看日誌,回車鍵查看更多。
git log -p
git log -p -2
正如你所看到的,--stat
選項在每次提交的下面列出全部被修改過的文件、有多少文件被修改了以及被修改過 的文件的哪些行被移除或是添加了。 在每次提交的最後還有一個總結。
git log --stat
git log --oneline
git log --graph
其餘參數
選項 | 說明 |
---|---|
-p | 按補丁格式顯示每一個更新之間的差別。 |
--stat | 顯示每次更新的文件修改統計信息。 |
--shortstat | 只顯示 --stat 中最後的行數修改添加移除統計。 |
--name-only | 僅在提交信息後顯示已修改的文件清單。 |
--name-status | 顯示新增、修改、刪除的文件清單。 |
--abbrev-commit | 僅顯示 SHA-1 的前幾個字符,而非全部的 40 個字符。 |
--relative-date | 使用較短的相對時間顯示(好比,「2 weeks ago」)。 |
--graph | 顯示 ASCII 圖形表示的分支合併歷史。 |
--pretty | 使用其餘格式顯示歷史提交信息。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式) |
若是你不當心添加了一個文件,但本不想讓它進行跟蹤管理,僅僅是臨時使用,那麼怎樣才能從暫存區取消呢?
# 進入項目目錄 $ cd /path/to # 添加一個文件 $ touch a.txt # 添加到暫存區 $ git add a.txt
此時查看git的狀況:
$ git status
# 查看當前文件,在暫存區等待提交。 On branch master Your branch is up to date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: a.txt
取消暫存:
$ git reset HEAD a.txt
$ git status
# 能夠看到a.txt是未跟蹤狀態了。
若是一個文件已經被跟蹤過了,並且已經修改後被add到了暫存區如今想取消修改暫存狀態。
$ git reset HEAD a.txt $ git checkout -- a.txt
git checkout -- [file]是一個危險的命令。你對那個文件作的任何修改都會消失 - 你只是拷貝了另外一個文件來覆蓋它。
所有回滾:
git reset --hard HEAD
--hard
會讓工做目錄也會回滾到未修改以前的狀態。
讓某個文件回滾到某個版本的狀態。
$ git checkout -- filepath
通常咱們總會有些文件無需歸入 Git 的管理,也不但願它們總出如今未跟蹤文件列表。 一般都是些自動生成的文 件,好比日誌文件,或者編譯過程當中建立的臨時文件等。 在這種狀況下,咱們能夠建立一個名爲 .gitignore
的文件,列出要忽略的文件模式。
咱們再看一個 .gitignore 文件的例子: '
# no .a files *.a # but do track lib.a, even though you're ignoring .a files above !lib.a # only ignore the TODO file in the current directory, not subdir/TODO /TODO # ignore all files in the build/ directory build/ # ignore doc/notes.txt, but not doc/server/arch.txt doc/*.txt # ignore all .pdf files in the doc/ directory doc/**/*.pdf
通常此文件會放到工做目錄的根目錄下,此文件中匹配的全部文件都會被git全部的命令忽略。
<pre v-pre="" data-lang="sh" Roboto Mono", Monaco, courier, monospace; line-height: 1.5rem; margin: 1.2em 0px; overflow: auto; padding: 0px 1.4rem; position: relative; overflow-wrap: normal; color: rgb(52, 73, 94); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> Copy to clipboardErrorCopied </pre>
![<pre v-pre="" data-lang="sh" Roboto Mono", Monaco, courier, monospace; line-height: 1.5rem; margin: 1.2em 0px; overflow: auto; padding: 0px 1.4rem; position: relative; overflow-wrap: normal; color: rgb(52, 73, 94); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> Copy to clipboardErrorCopied </pre>