原文地址:http://blog.csdn.net/wlgy123/article/details/51002805

如果不特殊说明,'$'表示在linux终端命令行下执行


一. 安装git
linux Fedora系列安装命令:$ sudo yum install git
linux Debian系列安装命令:$ sudo apt-get install git

二. 配置git
假设此时已经安装了git,则先要对git进行配置,配置分三个等级:
1. /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
2. ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
3. 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库

可以通过如下命令查看配置列表:$ git config --list
可以通过输入 git config <key>: 来检查 Git 的某一项配置, e.g: $ git config user.name

三. git仓库操作
1.克隆已经存在的远程仓库
默认名称保存:$ git clone https://github.com/libgit2/libgit2
重新命名保存:$ git clone https://github.com/libgit2/libgit2 mylibgit

2.使用 Git 来对现有的项目进行管理
进入该项目目录并输入:$ git init
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。 (参见 Git 内部原理 来了解更多关于到底 .git 文件夹中包含了哪些文件的信息。)

如果你是在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库来进行版本控制的话,你应该开始跟踪这些文件并提交。 你可通过 git add 命令来实现对指定文件的跟踪,然后执行 git commit 提交:
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'

四. 命令集合
1.查看文件状态
$ git status //查看当前文件状态
$ git status -s  <=>  $ git status --short
  状态符号说明:
    ?? 新添加的未跟踪文件
    A  新添加到暂存区中的文件
     M M位于右侧: 文件被修改了但是还没放入暂存区
    M  M位于左侧:文件被修改了并放入了暂存区
    MM 在工作区被修改并提交到暂存区后又在工作区中被修改了

2. git add
$ git add [filename]  //开始跟踪文件,或将修改的文件添加到暂存区

3.忽略文件
$ vim .gitignore
  --- 编辑该文件可过滤掉无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表中的文件,需要注意的是,这些文件必须不在跟踪状态下才有效。
  --- 详细的例子可以参考: https://github.com/github/gitignore

4.查看差异
$ git diff  // 查看尚未暂存的文件变化

$ git diff --cached    <=>  $ git diff  // 查看尚未暂存的文件变化,Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些。

$ git diff branch_name origin/branch_name //查看本地分支已经commit后的数据和远端分支的差异


5.提交更新
$ git commit -m "提交已经存入缓存区的文件"
$ git commit -a -m "提交所有跟踪的已经修改的文件"  <=>  $ git add   和  $ git commit -m ""

6. git rm
$ git rm [filename]  //下一次提交时,该文件就不再纳入版本管理了。 若删除前修改过并已经放到暂存区域,则必须要用强制删除选项 -f
$ git rm log/\*.log  //删除 log/ 目录下扩展名为 .log 的所有文件(注意星号 * 之前的反斜杠 \)
$ git rm \*~         //删除以 ~ 结尾的所有文件

$ git rm --cached [filename]  
  --- 让文件保留在磁盘,但是并不想让 Git 继续跟踪
  --- 当忘记添加 .gitignore 文件,又不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。

7. git mv
$ git mv README.md README 相当与运行了如下三个命令
  $ mv README.md README
  $ git rm README.md
  $ git add README

8. 查看提交历史
$ git log        //按提交时间列出所有的更新,最近的更新排在最上面
$ git log -p -2  //-p,用来显示每次提交的内容差异。 -2, 表示仅显示最近两次提交 ; 该选项除了显示基本信息之外,还在附带了每次 commit 的变化
$ git log --stat //每次提交的下面列出额所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了
$ git log --pretty=oneline
  ca82a6dff817ec66f44342007202690a93763949 changed the version number
  085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
  a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
$ git log --pretty=format:"%h - %an, %ar : %s"
  ca82a6d - Scott Chacon, 6 years ago : changed the version number
  085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
  a11bef0 - Scott Chacon, 6 years ago : first commit
    git log --pretty=format 常用的选项
    选项      说明
    %H        提交对象(commit)的完整哈希字串
    %h        提交对象的简短哈希字串
    %T        树对象(tree)的完整哈希字串
    %t        树对象的简短哈希字串
    %P        父对象(parent)的完整哈希字串
    %p        父对象的简短哈希字串
    %an       作者(author)的名字
    %ae       作者的电子邮件地址
    %ad       作者修订日期(可以用 --date= 选项定制格式)
    %ar       作者修订日期,按多久以前的方式显示
    %cn       提交者(committer)的名字
    %ce       提交者的电子邮件地址
    %cd       提交日期
    %cr       提交日期,按多久以前的方式显示
    %s        提交说明
$ git log --short  <=> $ git log -s
$ git log --pretty=full
$ git log --pretty=fuller

git log 的常用选项
选项              说明
-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(后跟指定格式)。


$ git log -S function_name  //列出那些添加或移除了某些字符串的提交。 比如说,你想找出添加或移除了某一个特定函数的引用的提交,你可以这样使用
$ git log --since=2.weeks   //列出所有最近两周内的提交

限制 git log 输出的选项
选项              说明
-(n)              仅显示最近的 n 条提交
--since, --after  仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author          仅显示指定作者相关的提交。
--committer       仅显示指定提交者相关的提交。
--grep            仅显示含指定关键字的提交
-S                仅显示添加或移除了某个关键字的提交

例子:
$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t/
    5610e3b - Fix testcase failure when extended attributes are in use
    acd3b9e - Enhance hold_lock_file_for_{update,append}() API
    f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
    d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
    51a94af - Fix "checkout --track -b newbranch" on detached HEAD

9. 撤销操作
$ git commit --amend  //有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交
    这个命令会将暂存区中的文件提交。
    如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。
    文本编辑器启动后,可以看到之前的提交信息。 编辑后保存会覆盖原来的提交信息。
    例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作,最终你只会有一个提交, 第二次提交将代替第一次提交的结果:
    $ git commit -m 'initial commit'
    $ git add forgotten_file
    $ git commit --amend

取消暂存的文件:
$ git reset HEAD [filename]
e.g:下面的例子,将不会将 readme.txt文件添加到暂存区
  $ git add readme.txt
  $ git reset HEAD readme.txt

撤销对文件的修改
$ git checkout -- [file]    //将还原成上次提交时的样子(或者刚克隆完的样子,即刚把它放入工作目录时的样子)

记住,在 Git 中任何 已提交的 东西几乎总是可以恢复的。
甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以恢复。
然而,任何你未提交的东西丢失后很可能再也找不到了


10. 远程仓库的使用
1) 查看远程仓库
$ git remote
$ git remote -v
  origin  https://github.com/schacon/ticgit (fetch)
  origin  https://github.com/schacon/ticgit (push)

2) 添加远程仓库
$ git remote add <shortname> <url>  //加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写

例子:
$ git remote
  origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
  origin  https://github.com/schacon/ticgit (fetch)
  origin  https://github.com/schacon/ticgit (push)
  pb  https://github.com/paulboone/ticgit (fetch)
  pb  https://github.com/paulboone/ticgit (push)

现在你可以在命令行中使用字符串 pb 来代替整个 URL。 例如,如果你想拉取 Paul 的仓库中有但你没有的信息,可以运行 git fetch pb
现在 Paul 的 master 分支可以在本地通过 pb/master 访问到 - 你可以将它合并到自己的某个分支中,或者如果你想要查看它的话,可以检出一个指向该点的本地分支

3) 从远程仓库中抓取与拉取
$ git fetch [remote-name]  //从远程仓库中获得数据
  --- 这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
  --- 如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
  ---如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。 这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

4) 推送到远程仓库
当你想分享你的项目时,必须将其推送到上游。 这个命令很简单:git push [remote-name] [branch-name]。
$ git push origin master  //将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字)


5) 查看远程仓库
如果想要查看某一个远程仓库的更多信息,可以使用 git remote show [remote-name] 命令。 如果想以一个特定的缩写名运行这个命令,例如 origin,会得到像下面类似的信息:
$ git remote show origin
$ git remote -v

6) 远程仓库的移除与重命名
如果想要重命名引用的名字可以运行 git remote rename 去修改一个远程仓库的简写名。 例如,想要将 pb 重命名为 paul,可以用 git remote rename 这样做:
$ git remote rename pb paul
$ git remote
  origin
  paul
注意:这同样也会修改你的远程分支名字。 那些过去引用 pb/master 的现在会引用 paul/master。

如果因为一些原因想要移除一个远程仓库 - 你已经从服务器上搬走了或不再想使用某一个特定的镜像了,又或者某一个贡献者不再贡献了 - 可以使用 git remote rm :
$ git remote rm paul
$ git remote
  origin

11. TAG标签
1) 查看标签:
$ git tag
  v0.1
  v1.3

$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
2) 创建标签
Git 使用两种主要类型的标签:附注标签(annotated)与轻量标签(lightweight)。

a) 附注标签: 存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签,这样你可以拥有以上所有信息;但是如果你只是想用一个临时的标签,或者因为某些原因不想要保存那些信息,轻量标签也是可用的。
下面命令-m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会运行编辑器要求你输入信息。
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4

通过使用 git show 命令可以看到标签信息与对应的提交信息:
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

changed the version number

b) 轻量标签: 很像一个不会改变的分支 - 它只是一个特定提交的引用。
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

3) 后期打标签

你也可以对过去的提交打标签。 假设提交历史是这样的:
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

现在,假设在 v1.2 时你忘记给项目打标签,也就是在 “updated rakefile” 提交。 你可以在之后补上标签。 要在那个提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和):

$ git tag -a v1.2 9fceb02

可以看到你已经在那次提交上打上标签了:
$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date:   Sun Apr 27 20:43:35 2008 -0700

    updated rakefile
...

4) 共享标签
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样 - 你可以运行 git push origin [tagname]。

$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。 这将会把所有不在远程仓库服务器上的标签全部传送到那里。

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

现在,当其他人从仓库中克隆或拉取,他们也能得到你的那些标签。
检出标签

在 Git 中你并不能真的检出一个标签,因为它们并不能像分支一样来回移动。 如果你想要工作目录与仓库中特定的标签版本完全一样,可以使用 git checkout -b [branchname] [tagname] 在特定的标签上创建一个新分支:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

当然,如果在这之后又进行了一次提交,version2 分支会因为改动向前移动了,那么 version2 分支就会和 v2.0.0 标签稍微有些不同,这时就应该当心了。


12. Git 别名

Git 并不会在你输入部分命令时自动推断出你想要的命令。 如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。 这里有一些例子你可以试试:

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

当要输入 git commit时,只需要输入 git ci。 随着你继续不断地使用 Git,可能也会经常使用其他命令,所以创建别名时不要犹豫。

在创建你认为应该存在的命令时这个技术会很有用。 例如,为了解决取消暂存文件的易用性问题,可以向 Git 中添加你自己的取消暂存别名:

$ git config --global alias.unstage 'reset HEAD --'

这会使下面的两个命令等价:

$ git unstage fileA
$ git reset HEAD -- fileA

这样看起来更清楚一些。 通常也会添加一个 last 命令,像这样:

$ git config --global alias.last 'log -1 HEAD'

这样,可以轻松地看到最后一次提交:

$ git last
commit 66938dae3329c7aebe598c2246a8e6af90d04646
Author: Josh Goebel <dreamer3@example.com>
Date:   Tue Aug 26 19:48:51 2008 +0800

    test for current head

    Signed-off-by: Scott Chacon <schacon@example.com>

可以看出,Git 只是简单地将别名替换为对应的命令。 然而,你可能想要执行外部命令,而不是一个 Git 子命令。如果是那样的话,可以在命令前面加入 ! 符号。 如果你自己要写一些与 Git 仓库协作的工具的话,那会很有用。例如: git visual 定义为 gitk 的别名:
$ git config --global alias.visual '!gitk'


13. Git 分支
1)查看分支
$ git branch    //查看所有本地分支列表
$ git branch -a //查看所有分支,包括远程分支
$ git branch -v //查看每一个分支的最后一次提交
$ git branch --merged     // 查看列表中已经合并到当前分支的分支
$ git branch --no-merged  // 查看列表中尚未合并到当前分支的分支

$ git ls-remote //显式地获得远程引用的完整列表


2)创建分支
$ git branch testing     //新建testing分支,但不会切换到该分支
$ git checkout testing   //要切换到一个已存在的分支,你需要使用 git checkout 命令,本命令将切换到testing分支,注意:每次切换分支后,本地代码将改变,重置为目标分支代码!
$ git checkout -b testing    //新建 testing 分支,并切换到该分支


3)分支合并 -- 无冲突的场景
$ git checkout master    // 切换到 master 分支
$ git merge testing      // testing 分支合并到 master
$ git branch -d testing  // 删除 testing 分支
  注意:删除分支,特殊情况(包含了还未合并的工作或其他原因)尝试使用 git branch -d 命令删除它时会失败,此时可以使用 -D 选项强制删除它:
  $ git branch -D testing

4)解决冲突
$ git checkout master    // 切换到 master 分支
$ git merge iss53        // iss53 分支合并到 master

$ git status     //查看状态可以看到哪个文件处于冲突状态

--编辑冲突
$ git mergetool  //如果想使用图形化工具来解决冲突, 该命令会为你启动一个合适的可视化合并工具(已经配置的前提下)
$ vim index.html //编辑冲突文件

$ git add index.html     // 解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决. 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。
$ git commit index.html -m "合并冲突"  //完成合并提交

5) 远程分支
https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF

$ git remote show origin
* remote origin
  Fetch URL: ***
  Push  URL: ***
  HEAD branch: master
  Remote branches:
    ***
$ git remote prune

6)变基
https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA


参考资料:

https://git-scm.com/book/en/v2


原文地址:http://blog.csdn.net/wlgy123/article/details/51002805

Logo

更多推荐