$ git config --global user.name "userName"
$ git config --global user.email "[email protected]"
读取时,默认情况下从系统,全局和存储库本地配置文件读取这些值,而选项–system,–global,–local 和–file 可用于告知命令从只有那个位置设置和读取。
$ git config user.name "userName"
$ git config user.email "[email protected]"
$ git config --global core.editor vim
$ git config --global merge.tool vimdiff
$ git config --list
添加配置项
$ git config --add site.name _Name
删除配置项
$ git config --local -–unset site.name
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
例如,有关 git config 如何使用
$ git help config
git help [-a|--all] [-g|--guide]
[-i|--info|-m|--man|-w|--web] [COMMAND|GUIDE]
注意,git --help …与 git help 相同,因为前者被内部转换为后者。
$ cd /path/to/my/codebase
$ git init #(1)
$ git add . #(2)
$ git commit . -m "a commit message" #(3)
(1). 创建一个/path/to/my/codebase/.git 目录。
(2). 将所有现有文件添加到索引。
(3). 将原始状态记录为历史的第一个提交。
基本用法:
git add <path>
$ git add . # 将所有修改添加到暂存区
$ git add * # Ant 风格添加修改
$ git add *Controller # 将以 Controller 结尾的文件的所有修改添加到暂存区
$ git add Hello* # 将所有以 Hello 开头的文件的修改添加到暂存区 例如:HelloWorld.txt,Hello.java,HelloGit.txt ...
$ git add Hello? # 将以 Hello 开头后面只有一位的文件的修改提交到暂存区 例如:Hello1.txt,HelloA.java 如果是 HelloGit.txt 或者 Hello.java 是不会被添加的
git add -u [ ]
git add -A [ ]
git add -i [ ] 打开暂存区索引
* t.txt 和 t2.txt 表示已经被执行了 git add,待提交。即已经添加到索引库中。
* readme.txt 表示已经处于 tracked 下,它被修改了,但是还没有执行 git add。即还没添加到索引库中。
git clone 命令将存储库克隆到新目录中。
执行远程克隆
$ git clone <版本库的网址>
$ git clone <版本库的网址> <本地目录名>
# 支持多种格式
$ git clone http[s]://example.com/path/to/repo.git
$ git clone http://git.oschina.net/yiibai/sample.git
$ git clone ssh://example.com/path/to/repo.git
$ git clone git://example.com/path/to/repo.git
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git
$ git clone rsync://example.com/path/to/repo.git
常见应用场景示例
$ git clone git://git.kernel.org/pub/scm/.../linux.git mydir
$ cd mydir
$ make # 执行代码或其它命令
$ git clone -l -s -n . ../copy
$ cd ../copy
$ git show-branch
$ git clone --reference /git/linux.git git://git.kernel.org/pub/scm/.../linux.git mydir
$ cd mydir
$ git clone --bare -l /home/proj/.git /pub/scm/proj.git
git status [<options>…] [--] [<pathspec>…]
git status 相对来说是一个简单的命令,它简单的展示状态信息。输出的内容分为 3 个分类/组。
*.pyc
*.tmp
示例
$ git diff <file> # 比较当前文件和暂存区文件差异
$ git diff git diff <id1><id1><id2> # 比较两次提交之间的差异 $ git diff # 在两个分支之间比较
$ git diff --staged # 比较暂存区和版本库差异
$ git diff --cached # 比较暂存区和版本库差异
$ git diff --stat # 仅仅比较统计信息
检查工作树的几种方式
$ git diff #(1)
$ git diff --cached #(2)
$ git diff HEAD #(3)
$ git diff
显示的是下一次提交时会提交到 HEAD 的内容(不带-a 情况下)
$ git diff --cached
$ git diff --staged
显示工作版本(Working tree)和 HEAD 的差别
$ git diff HEAD
输出自topic和master分别开发以来,master分支上的变更
$ git diff topic master #或
$ git diff topic..master
显示当前分支与另一个 branch 的区别
$ git diff <branch>
比较上次提交和上上次提交
$ git diff HEAD^ HEAD
比较两个历史版本的差异
$ git diff SHA1 SHA2
显示当前目录下的 lib 目录和上次提交之间的差别(更准确的说是在当前分支下)
$ git diff HEAD -- ./lib
要添加的内容可以通过以下几种方式指定:
如果您提交,然后立即发现错误,可以使用 git reset 命令恢复。
$ git add . # 或者~ $ git add newfile.txt
$ git commit -m "the commit message" #
$ git commit -a # 会先把所有已经 track 的文件的改动`git add`进来,然后提交(有点像 svn 的一次提交,不用先暂存)。对于没有 track 的文件,还是需要执行`git add ` 命令。
$ git commit --amend # 增补提交,会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消。
git reset [–hard|soft|mixed|merge|keep] [或 HEAD]
$ edit file1.c file2.c # (1)
$ git add file1.c file1.c # (1.1) 添加两个文件到暂存
$ mailx # (2)
$ git reset # (3)
$ git pull git://info.example.com/ nitfol # (4)
(1). 编辑文件 file1.c, file2.c,做了些更改,并把更改添加到了暂存区。
(2). 查看邮件,发现某人要您执行 git pull,有一些改变需要合并下来。
(3). 然而,您已经把暂存区搞乱了,因为暂存区同 HEAD commit 不匹配了,但是即将 git pull 下来的东西不会影响已经修改的 file1.c 和 file2.c,因此可以 revert 这两个文件的改变。在 revert 后,那些改变应该依旧在工作目录中,因此执行 git reset。
(4). 然后,执行了 git pull 之后,自动合并,file1.c 和 file2.c 这些改变依然在工作目录中。
$ git commit -a -m "这是提交的备注信息"
$ git reset --soft HEAD^ #(1)
$ edit code #(2) 编辑代码操作
$ git commit -a -c ORIG_HEAD #(3)
(1) 当提交了之后,发现代码没有提交完整,或者想重新编辑一下提交的信息,
(2) 对工作目录下的文件做修改,比如:修改文件中的代码等。
(3) 然后使用 reset 之前那次提交的注释、作者、日期等信息重新提交。
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
(1) 假设已经提交了一些代码,但是此时发现这些提交还不够成熟,不能进入 master 分支,希望在新的 branch 上暂存这些改动。因此执行了 git branch 命令在当前的 HEAD 上建立了新的叫做 topic/wip 的分支。
(2)<–hard> 然后回滚 master 分支上的最近三次提交。HEAD~3 指向当前 HEAD-3 个提交,git reset --hard HEAD~3,即删除最近的三个提交(删除 HEAD, HEAD^, HEAD~2),将 HEAD 指向 HEAD~3。
$ git commit ## 执行一些提交
$ git reset --hard HEAD~3 (1)
$ git pull (1)
Auto-merging nitfol CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard (2)
$ git pull . topic/branch (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD (4)
(1) 从origin拉取下来一些更新,但是产生了很多冲突,但您暂时没有这么多时间去解决这些冲突,因此决定稍候有空的时候再重新执行 git pull 操作。
(2) 由于 git pull 操作产生了冲突,因此所有拉取下来的改变尚未提交,仍然再暂存区中,这种情况下 git reset --hard 与 git reset --hard HEAD 意思相同,即都是清除索引和工作区中被搞乱的东西。
(3) 将 topic/branch 分支合并到当前的分支,这次没有产生冲突,并且合并后的更改自动提交。
(4) 但是此时又发现将 topic/branch 合并过来为时尚早,因此决定退滚合并,执行 git reset --hard ORIG_HEAD 回滚刚才的 pull/merge 操作。
说明:前面讲过,执行 git reset 时,git 会把 reset 之前的 HEAD 放入.git/ORIG_HEAD 文件中,命令行中使用 ORIG_HEAD 引用这个提交。同样的,执行 git pull 和 git merge 操作时,git 都会把执行操作前的 HEAD 放入 ORIG_HEAD 中,以防回滚操作。
$ git pull (1)
Auto-merging nitfol
Merge made by recursive.
nitfol | 20 +++++---- ...
$ git reset --merge ORIG_HEAD (2)
(1) 即便你已经在本地更改了工作区中的一些东西,可安全的执行git pull操作,前提是要知道将要git pull下面的内容不会覆盖工作区中的内容。
(2)git pull完后,发现这次拉取下来的修改不满意,想要回滚到git pull之前的状态,
pull 且 merge,不改变工作区未提交修改
$ git checkout feature ; # you were working in "feature" branch and
$ work work work ; # got interrupted
$ git commit -a -m "snapshot WIP" (1)
$ git checkout master
$ fix fix fix
$ git commit ;# commit with real log
$ git checkout feature
$ git reset --soft HEAD^ ;# go back to WIP state (2)
$ git reset (3)
(1) 这次属于临时提交,因此随便添加一个临时注释即可。
(2) 这次 reset 删除了 WIP commit,并且把工作区设置成提交 WIP 快照之前的状态。
(3) 此时,在索引中依然遗留着“snapshot WIP”提交时所做的未提交变化,git reset 将会清理索引成为尚未提交”snapshot WIP“时的状态便于接下来继续工作。
$ git reset -- frotz.c (1)
$ git commit -m "Commit files in index" (2)
$ git add frotz.c (3)
(1) 把文件 frotz.c 从索引中去除,
(2) 把索引中的文件提交
(3) 再次把 frotz.c 加入索引
$ git tag start
$ git checkout -b branch1
$ edit
$ git commit ... (1)
$ edit
$ git checkout -b branch2 (2)
$ git reset --keep start (3)
(1) 这次是把在 branch1 中的改变提交了。
(2) 此时发现,之前的提交不属于这个分支,此时新建了 branch2 分支,并切换到了 branch2 上。
(3) 此时可以用 reset --keep 把在 start 之后的提交清除掉,但是保持工作区不变。
reset --keep 取消在当前分支的提交但是不更改工作区的内容,切换分支同时保持工作区状态
git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…
rm 与 git rm
如果之前不小心用 rm 命令删除了一大批文件呢?如此时用 git rm 逐个地再删除一次就显得相当卵痛了。可如下的方式做提交:git commit -am “commit message or mark”
git commit -am "commit message or mark
在 git 中我们可以通过 git rm 命令把一个文件删除,并把它从 git 的仓库管理系统中移除。但是注意最后要执行 git commit 才真正提交到 git 仓库。
$ git rm text1.txt
$ git rm -r mydir
$ git add 10.txt
$ git add -i
staged unstaged path
1: +0/-0 nothing 10.txt
2: +0/-0 nothing branch/t.txt
3: +0/-0 nothing branch/t2.txt
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> 7
Bye.
$ git rm --cached 10.txt rm '10.txt'
$ ls 10.txt 2 3.txt 5.txt readme.txt
$ git add -i
staged unstaged path
1: +0/-0 nothing branch/t.txt
2: +0/-0 nothing branch/t2.txt
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
删除某个目录下及其子文件下的索引中删除指定类型的文件
$ git rm Documentation/\*.txt
$ git rm -f git-*.sh
git mv <options>… <args>…
git mv [-v] [-f] [-n] [-k] <source> <destination>
git mv [-v] [-f] [-n] [-k] <source> ... <destination directory>
索引在成功完成后更新,但仍必须提交更改。
$ git mv text.txt mydir
$ mv test.txt mydir/
$ git rm test.txt
$ git add mydir
git branch 命令用于列出,创建或删除分支。
$ git branch
master
* wchar_support
*
)。$ git branch dev2
$ git checkout dev2
$ # 再次查看分支
$ git branch
* dev2
master
wchar_support
$ git branch -a
* dev2
master
wchar_support
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/wchar_support
$ git status
$ git add newfile.txt
$ git commit newfile.txt -m "commit a new file: newfile.txt"
$ git push origin dev2
git branch
git branch -m <branchname> <newbranchname>
$ git branch -r
$ git branch origin --delete <branch>
删除一个名称为:dev2 的远客
$ git branch
$ git checkout master
$ git status
$ git merge <another branch>
合并分支:version.2 到当前分支(master)
以下顺序检查主分支,将 Makefile 还原为两个修订版本,错误地删除 hello.c,并从索引中取回。
$ git checkout master #(1)
$ git checkout master~2 Makefile #(2)
$ rm -f hello.c
$ git checkout hello.c #(3)
(1) 切换分支
(2) 从另一个提交中取出文件
(3) 从索引中恢复 hello.c
防止存在分支名为 hello.c,规范写法 $ git checkout – hello.c
$ git checkout – filename 表示从索引中牵出,并恢复到工作区
在错误的分支工作后,想切换到正确的分支,则使用:
$ git checkout mytopic
“错误”分支和正确的“mytopic”分支可能会在在本地修改的文件中有所不同,在这种情况下,上述检出将会失败:
$ git checkout mytopic
error: You have local changes to 'frotz'; not switching branches.
可以将-m 标志赋给命令,这将尝试三路合并:
$ git checkout -m mytopic
Auto-merging frotz
当使用-m 选项切换分支时发生合并冲突时,会看到如下所示
$ git checkout -m mytopic
Auto-merging frotz
ERROR: Merge conflict in frotz
fatal: merge program failed
使用 git diff 显示冲突位置,编辑并解决冲突,并 add 标记给索引
$ edit frotz # 编辑 frotz 文件中内容,然后重新添加
$ git add frotz
$ git checkout master
#//取出 master 版本的 head。
$ git checkout tag_name
#//在当前分支上 取出 tag_name 的版本
$ git checkout master file_name
#//放弃当前对文件 file_name 的修改
$ git checkout commit_id file_name
#//取文件 file_name 的 在 commit_id 是的版本。commit_id 为 git commit 时的 sha 值。
$ git checkout -b dev/1.5.4 origin/dev/1.5.4
# 从远程 dev/1.5.4 分支取得到本地分支/dev/1.5.4
$ git checkout -- hello.rb
# 这条命令把 hello.rb 从 HEAD 中签出
$ git checkout .
# 这条命令把 当前目录所有修改的文件 从 HEAD 中签出并且把它恢复成未修改时的样子.
# 注意:在使用 git checkout 时,如果其对应的文件被修改过,那么该修改会被覆盖掉。
合并分支branch1 和 branch2 在当前分支的顶部,使它们合并:
$ git merge branch1 branch2
合并 obsolete 分支到当前分支,使用 ours 合并策略
$ git merge -s ours obsolete
将分支 maint 合并到当前分支中,但不要自动进行新的提交
$ git merge --no-commit maint
将分支 dev 合并到当前分支中,自动进行新的提交:
$ git merge dev
git mergetool 命令用于运行合并冲突解决工具来解决合并冲突。
git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…]
#difftool 配置
$ git config --global diff.tool bc4
$ git config --global difftool.bc4.cmd "\"c:/program files (x86)/beyond compare 4/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""
#mergeftool 配置
$ git config --global merge.tool bc4
$ git config --global mergetool.bc4.cmd "\"c:/program files (x86)/beyond compare 4/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""
$ git config --global mergetool.bc4.trustExitCode true
#让 git mergetool 不再生成备份文件(*.orig)
$ git config --global mergetool.keepBackup false
使用方法
$ git difftool HEAD #// 比较当前修改情况
$ git mergetool
显示整个提交历史记录,但跳过合并
$ git log --no-merges
显示自 master 以来所有提交更改 include/scsi 或 drivers/scsi 子目录中的任何文件的所有提交
$ git log master include/scsi drivers/scsi
显示最近两周的更改文件 gitk。 “–”是必要的,以避免与名为 gitk 的分支混淆
$ git log --since="2 weeks ago" --gitk
# 当前目录下的文件 gitk
显示“test”分支中尚未在“release”分支中的提交,以及每个提交修改的路径列表
$ git log --name-status release..test
显示更改 builtin/rev-list.c 的提交,包括在文件被赋予其现有名称之前发生的提交
$ git log --follow builtin/rev-list.c
显示在任何本地分支中的所有提交,但不包括任何远程跟踪分支机构的起始点(origin 不具有)。
$ git log --branches --not --remotes=origin
显示本地主服务器中的所有提交,但不显示任何远程存储库主分支。
$ git log master --not --remotes=*/master
显示历史,包括变化差异,但仅从“主分支”的角度来看,忽略来自合并分支的提交,并显示合并引入的变化的完全差异。只有当遵守在一个整合分支上合并所有主题分支的严格策略时,这才有意义。
$ git log -p -m --first-parent
显示文件 main.c 中的函数 main( )随着时间的推移而演变
$ git log -L '/int main/',/^}/:main.c
将显示最近三次的提交
$ git log -3
根据提交 ID 查询日志
$ git log commit_id
# 查询 ID(如:6bab70a)之前的记录,包含 commit
$ git log commit1_id commit2_id
# 查询 commit1 与 commit2 之间的记录,包括 commit1 和 commit2
$ git log commit1_id..commit2_id
# 查询 commit1 与 commit2 之间的记录,但是不包括 commit1
创建的最新储藏存储在 refs/stash 中;
这个引用的反垃圾邮件中会发现较旧的垃圾邮件,并且可以使用通常的 reflog 语法命名
(例如,stash@{0}是最近创建的垃圾邮件,stash@{1}是 stash@{2.hours.ago}之前也是可能的)。
也可以通过指定存储空间索引(例如整数 n 相当于储藏 stash@{n})来引用锁存。
$ git stash
$ git pull
$ git stash pop
# ... hack hack hack ...
$ git checkout -b my_wip
$ git commit -a -m "WIP"
$ git checkout master
$ edit emergency fix # 编辑内容
$ git commit -a -m "Fix in a hurry"
$ git checkout my_wip
$ git reset --soft HEAD^
# ... continue hacking ...
上面过程可以使用 git stash 来简化上述操作
# ... hack hack hack ...
$ git stash
$ edit emergency fix
$ git commit -a -m "Fix in a hurry"
$ git stash pop
# ... continue hacking ...
# ... hack hack hack ...
$ git add --patch foo
# add just first part to the index
$ git stash save --keep-index
# save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'
# commit fully tested change
$ git stash pop
# prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'
$ git fsck --unreachable | grep commit | cut -d\ -f3 | xargs git log --merges --no-walk --grep=WIP
$ git stash drop <stash@{n}>
在某些情况下,可能想应用储藏的修改,在进行了一些其他的修改后,又要取消之前所应用储藏的修改。
$ git stash show -p stash@{0} | git apply -R
如果沒有指定具体的某个储藏,Git 会选择最近的储藏
$ git stash show -p | git apply -R
可能会想要新建一个別名,在你的 Git 里增加一个 stash-unapply 命令,这样更有效率
$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply $
#... work work work
$ git stash-unapply
我们可以用特定的搜索模式列出符合条件的标签。在 Git 自身项目仓库中,有着超过 240 个标签,如果只对 1.4.2 系列的版本感兴趣,可以运行下面的命令:
$ git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4
创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可,-m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,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: Scott Chacon <[email protected]>
Date: Mon Feb 9 14:45:11 2009 -0800
my version 1.4
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <[email protected]>
Date: Sun Feb 8 19:02:46 2009 -0800
Merge branch 'experiment'
想要名称删除名称为:v1.0 的标签,可以执行以下操作:
$ git tag -d v1.0
$ git tag v1.4-lw
$ git tag [-a][-m] tagname <commit>
$ git push origin v1.5 # 推送指定 tag
$ git push origin --tags # 推送本地所有新增的 tag
$ git fetch origin
$ git fetch origin master:tmp
$ git fetch origin +pu:pu maint:tmp
$ git fetch git://git.kernel.org/pub/scm/git/git.git maint
$ git log FETCH_HEAD
$ git fetch <远程主机名>
$ git fetch
$ git fetch <远程主机名> <分支名>
取回 origin 主机的 master 分支。$ git fetch origin master
所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如 origin 主机的 master 分支,就可以用 origin/master 读取。
$ git merge origin/master
# 或者
$ git rebase origin/master
git pull [options] [<repository> [<refspec>…]]
要取回 origin 主机的 next 分支,与本地的 master 分支合并
$ git pull <远程主机名> <远程分支名>:<本地分支名>
# -------------------------------------------
$ git pull origin next:master
$ git fetch origin
$ git merge origin/next
手动建立追踪关系
$ git branch <存在的分支名> --set-upstream-to origin/master
# origin\master 可以换成本地某分支名
创建新分支建立追踪关系
$ git branch --track <newbranch> <ExistBranch>
$ git pull origin [<远程分支名>]
$ git pull
$ git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
git fetch:相当于是从远程获取最新版本到本地,不会自动合并。
$ git fetch origin master
$ git log -p master..origin/master
$ git merge origin/master
$ git fetch origin master:tmp
$ git diff tmp
$ git merge tmp
git pull:相当于是从远程获取最新版本并 merge 到本地
git pull origin master
$ git push <远程主机名> <本地分支名>:<远程分支名>
将本地的 master 分支推送到 origin 主机的 master 分支。如果 master 不存在,则会被新建。
$ git push origin master
$ git push origin :master
# 等同于
$ git push origin --delete master
$ git push origin
$ git push
如果当前分支与多个主机存在追踪关系,则可以使用-u 选项指定一个默认主机,这样后面就可以不加任何参数使用 git push。
$ git push -u origin master
$ git push --all origin
如果远程主机的版本比本地版本更新,推送时 Git 会报错,要求先在本地做 git pull 合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用–force选项。
$ git push --force origin
**!!!**使用-–force选项,结果导致在远程主机产生一个”非直进式”的合并(non-fast-forward merge)。除非你很确定要这样做,否则应该尽量避免使用–-force选项。
$ git push origin --tags
$ git push origin HEAD
$ git push origin HEAD:master
推送本地分支 lbranch-1 到新远程分支 rbranch-1
$ git push origin lbranch-1:refs/rbranch-1
推送 lbranch-2 到已有的 rbranch-1,用于补充 rbranch-1:
$ git checkout lbranch-2
$ git rebase rbranch-1
$ git push origin lbranch-2:refs/rbranch-1
用本地分支 lbranch-3 覆盖远程分支 rbranch-1
$ git push -f origin lbranch-2:refs/rbranch-1
# 或
$ git push origin :refs/rbranch-1 //删除远程的 rbranch-1 分支
$ git push origin lbranch-1:refs/rbranch-1
查看 push 的结果
$ gitk rbranch-1
推送 tag
$ git push origin tag_name
删除远程标签
$ git push origin :tag_name
$ git remote origin
$ git remote -v(或 --verbose)
origin [email protected]:Jimry-YCwuli/JimryWorkSpace.git (fetch)
origin [email protected]:Jimry-YCwuli/JimryWorkSpace.git (push)
$ git remote # 查看远程主机
$ git branch -r # 查看远程主机及其仓库
$ git remote add <new 远程库> <git_SSH> # 远程 SSH
$ git remote rm <远程库 name> # 删除对应远程主机
$ git fetch <new 远程库> # 表示建立本地与新库的关联
$ git checkout -b <newbranch> <远程库/远程分支> # 创建一个新分支与远程新分支建立关联
git show [options] <object>…
1.显示标签 v1.0.0,以及标签指向的对象
$ git show v1.0.0
2.显示标签 v1.0.0 指向的树
$ git show v1.0.0^{tree}
3.显示标签 v1.0.0 指向的提交的主题
$ git show -s --format=%s v1.0.0^{commit}
4.显示 Documentation/README 文件的内容,它们是 next 分支的第 10 次最后一次提交的内容
$ git show next~10:Documentation/README
5.将 Makefile 的内容连接到分支主控的头部
$ git show master:Makefile master:t/Makefile
$ git shortlog [-s][-n]
$ git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>…]
$ git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]
如果符合条件的 tag 指向最新提交则只是显示 tag 的名字,否则会有相关的后缀来描述该 tag 之后有多少次提交以及最新的提交 commit id。不加任何参数的情况下,git describe 只会列出带有注释的 tag
$ git describe --tags tag1-2-g026498b
$ git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>] [<upstream> [<branch>]]
$ git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
$ git rebase --continue | --skip | --abort | --quit | --edit-todo
- 假设你现在基于远程分支”origin“,创建一个叫”mywork“的分支。
$ git checkout -b mywork origin
- 现在我们在这个分支(mywork)做一些修改,然后生成两个提交(commit).
$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit ... ...
- 但是与此同时,有些人也在”origin“分支上做了一些修改并且做了提交了,这就意味着”origin“和”mywork“这两个分支各自”前进”了,它们之间”分叉”了。
- 在这里,你可以用”pull“命令把”origin“分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的”合并的提交”(merge commit):
- 但是,如果你想让”mywork“分支历史看起来像没有经过任何合并一样,也可以用 git rebase,如下所示:
$ git checkout mywork
$ git rebase origin
- 这些命令会把你的”mywork“分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到”.git/rebase“目录中),
然后把”mywork“分支更新 到最新的”origin“分支,最后把保存的这些补丁应用到”mywork“分支上。
- 现在我们可以看一下用合并(merge)和用 rebase 所产生的历史的区别:
- 在 rebase 的过程中,也许会出现冲突(conflict)。在这种情况,Git 会停止 rebase 并会让你去解决冲突;
在解决完冲突后,用”git add“命令去更新这些内容的索引(index), 然后,你无需执行 git commit,只要执行:
$ git rebase --continue
- 在任何时候,可以用–abort 参数来终止 rebase 的操作,并且”mywork“ 分支会回到 rebase 开始前的状态。
$ git rebase --abort