获取帮助

  • git help
    获取git命令的简要描述
  • man git
    获取git的详细描述
  • 获取单个命令的详细描述
    git help cmd,git help config
  • 获取单个命令的简要描述
    git cmd -h或者git cmd --help
    例如:git add -h 或 git add --help

git环境配置

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

每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users\$USER)的 .gitconfig 文件。 Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。

2.常用配置

用户信息

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

文本编辑器

$ git config --global core.editor emacs
3.查看配置

检查配置信息

$ git config --list
user.name=John Doe
user.email=johndoe@example.com
color.status=auto
color.branch=auto
color.interactive=auto

查看某一项配置

// git config <key>
$ git config user.name
John Doe

git基础

1. 获取一个仓库

创建一个仓库
在要建立为仓库的目录下执行

git init

注意: 当服务器端仓库初始创建为空仓库时,本地仓库更新添加文件,在初始化仓库时需加上–bare,否则,本地仓库push文件时,会出如下错误

$ git commit -m "adfa"
[master (root-commit) 4a52dab] adfa
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1
binn@ubuntu:~/error_test$ git push origin master 
git@192.168.132.24's password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 198 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git@192.168.132.24:/home/git_server/error
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git@192.168.132.24:/home/git_server/error'

根据提示也可以解决该问题,但是不是最佳方案。

克隆一个仓库

git clone url

例如:

git clone https://github.com/libgit2/libgit2

克隆一个和远端一样的仓库,或

git clone https://github.com/libgit2/libgit2 mylibgit

克隆一个仅仓库名不同,其他相同的仓库

2. 跟踪文件

文件的状态变化周期
在这里插入图片描述
查看状态

git status

状态简要展示

git status -s

添加跟踪文件

git add 目录或文件

忽略文件
在某个目录下添加.gitignore文件,文件内容格式规则:

  • 所有空行或者以“#”开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式可以以“/”开头防止递归。
  • 匹配模式可以以“/”结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号“!”取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。
.gitignore 文件的例子:

# 不跟踪以.a结束的文件
*.a

# 上一个规则的例外,除了lib.a,其他都不跟踪
!lib.a

# 仅忽略当前目录下TODO文件夹,其他文件夹的子文件夹不受影响
/TODO

# 忽略所有build目录
build/

# 忽略doc目录下的txt文件,不影响doc子目录下的txt文件,如doc/server/1.txt
doc/*.txt

# 忽略所有doc目录下的pdf文件,包括doc目录下子目录的pdf文件
doc/**/*.pdf

查看尚未暂存的文件及其修改

# 工作区文件和索引区文件的对比
git diff

查看将要commit(索引区)的文件和本地仓库文件的区别

git diff --staged
// 等同git diff --cached

提交更新到本地仓库

git commit -m mesg
// 例如:git commit -m "Story 182: Fix benchmarks for speed"

一般提交,需要把文件add到索引区(也即缓存区),然后再提交。跳过使用暂存区域,直接提交到本地仓库

git commit -a mesg
// 例如:git commit -a -m 'added new benchmarks'

移除文件

git rm files
// 等同
rm files
git add files
git commit -m mesg

若文件已修改且提交到缓存区,增加选项-f

git rm -f files

从仓库中删除,不删除工作区文件

git rm --cached files

移动文件

git mv src  dest
// 等同
mv src dest
git rm src
git add dest
3.查看修改纪录

查看历史提交记录

git log

查看最近2次提交及差异

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

    changed the version number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.platform  =   Gem::Platform::RUBY
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "schacon@gee-mail.com"
     s.summary   =   "A simple gem for using Git in Ruby code."

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
     end

 end
-
-if $0 == __FILE__
-  git = SimpleGit.new
-  puts git.show
-end
\ No newline at end of file

查看提交并简要显示修改统计

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

    changed the version number

 Rakefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

修改纪录格式化输出

// 详细了解$ git log --pretty=的使用,例如
// 单行输出
$ 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 help log
选项								说明
-(n)    							仅显示最近的 n 条提交
--since, --after					仅显示指定时间之后的提交。
--until, --before					仅显示指定时间之前的提交。
--author							仅显示指定作者相关的提交。
--committer							仅显示指定提交者相关的提交。
--grep								仅显示含指定关键字的提交
-S									仅显示添加或移除了某个关键字的提交
4.撤销操作

若提交漏了文件,可以使用如下命令

git add files
git commit --amend

如此操作,git log显示的提交为同一次

取消暂存文件,在git status显示中也有相应提示

git reset HEAD  files

撤销对文件的修改,在git status显示中也有相应提示

git checkout -- files
5.远程仓库的使用

克隆远程仓库

// 用于初始化本地仓库,并与远程仓库有联系
git clone https://github.com/schacon/ticgit

查看远程仓库

// 显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
git remote -v

添加远程仓库

git remote add <shortname> <url>

例如:

$ 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)

origin、pb为远程服务器的仓库名

拉取远程仓库和本地仓库的区别部分

$ git fetch [remote-name]

这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。 如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支

推送到远程仓库

git push [remote-name] [branch-name]

例如,把本地master分支推动到远程origin服务器

$ git push origin master

若远程服务器仓库存在相同分支,后面章节说明解决方案。

查看远程仓库

git remote show [remote-name] 

例如查看远程仓库origin信息

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

远程仓库移除

$ git remote rm paul

重命名远程仓库

$ git remote rename pb paul
$ git remote
origin
paul

值得注意的是这同样也会修改你的远程分支名字。 那些过去引用 pb/master 的现在会引用 paul/master。

6.打标签

像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等)。 在本节中,你将会学习如何列出已有的标签、如何创建新标签、以及不同类型的标签分别是什么。

列出标签

$ 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

创建标签
轻量标签: 一个不会改变的分支 - 它只是一个特定提交的引用。
附注标签: 存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签,这样你可以拥有以上所有信息
建议: 如果你只是想用一个临时的标签,或者因为某些原因不想要保存那些信息,轻量标签也是可用的。

附注标签
创建标签

// 在运行 tag 命令时指定 -a 选项
// -m 选项指定了一条将会存储在标签中的信息。若未指定,会进入编辑器
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4

查看标签信息

$ 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

轻量标签
创建标签

// 不需要使用-a -m选项
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw

查看标签方式同附注标签

后期补打标签

git tag [选项] tag commitID
// 例如
$ git tag -a v1.2 9fceb02

共享标签

// 默认情况下,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

删除标签

// 使用命令 git tag -d <tagname>
$ git tag -d v1.4-lw
// 同时更新到远端服务器,必须使用 git push <remote> :refs/tags/<tagname>
$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw

检出标签

// git checkout tag
$ git checkout 2.0.0

副作用: 检出标签的版本处于“分离头指针”状态,不能做修改,若修改提交,不属于任何分支。若需要修改,需要创建新的分支,例如:

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

此时version2版本和v2.0.0版本不同。

7.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 config --global alias.unstage 'reset HEAD --'
// 以下两个命令等同
$ git unstage fileA
$ git reset HEAD -- fileA

查看最新一次的提交

$ 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'
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐