赞
踩
目录
用于将当前 HEAD
复位到指定状态。一般用于撤销之前的一些操作(如:git add
,git commit
等)。
- git reset [-q] [<tree-ish>] [--] <paths>…
- git reset (--patch | -p) [<tree-ish>] [--] [<paths>…]
- git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
在第一和第二种形式中,将条目从 <tree-ish>
复制到索引。
在第三种形式中,将当前分支头( HEAD
)设置为 <commit>
,可选择修改索引和工作树进行匹配。
所有形式的 <tree-ish>/<commit>
默认为 HEAD
。
将当前的分支重设到指定的 commit 或者 HEAD(默认),并根据 [mode] 有可能更新索引或工作目录。
[mode] :
hard
、soft
、mixed
、merged
、keep
git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
--hard
:重设(reset) 索引和工作目录,自从<commit>
以来在工作目录中的任何改变都被丢弃,并把HEAD指向 <commit>
。- $ 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) 自动合并,改变仍在工作目录
- $ git commit -a -m "这是提交的备注信息"
- $ git reset --soft HEAD^ #(1) HEAD^ 表示指向 HEAD 之前最近的一次提交
- $ edit code #(2) 编辑代码操作
- $ git commit -a -c ORIG_HEAD #(3)
git commit
命令中-a
参数的意思是告诉git,自动把所有修改的和删除的文件都放进暂存区,未被git跟踪的新建的文件不受影响。
commit
命令中-c <commit>
或者-C <commit>
意思是拿已经提交的对象中的信息(作者,提交者,注释,时间戳等)提交。
- $ git branch topic/wip (1)
- $ git reset --hard HEAD~3 (2) 回滚最近三次提交(删除 HEAD, HEAD^, HEAD~2)
- $ git checkout topic/wip (3)
- $ git pull (1)
- $ git reset --hard (2)
- $ git pull . topic/branch (3) 将 topic/branch 分支合并到当前的分支
- ,合并后的更改自动提交
- $ git reset --hard ORIG_HEAD (4) 把reset之前的HEAD放入.git/ORIG_HEAD文件中*
$ git reset --merge ORIG_HEAD (2)
git reset --hard ORIG_HEAD
回滚到 pull 之前的状态,同时清空工作区 add
的改变,为了避免丢弃工作区的内容,将 --hard
改成 --merge
,这样可以避免丢失。
git reset –-soft:回退到某个版本,只回退了 commit 的信息,不会恢复到 index file 一级。如果还要提交,直接 commit 即可;
git reset -–hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的 commit 中所包含的更改被冲掉。
在工作分支 feature 下,当正在修改文件内容但又未完全处理完时,需要到另一分支 master 上去修改其他文件所存在的 bug ,我们可以这么做:
- # 工作分支下暂时先提交修改
- $ git checkout feature
- $ ...
- $ git commit -a -m "snapshot WIP" (1)
- # 切换指定分支进行修改并提交
- $ git checkout master
- $ ...
- $ git commit
- # 回到原来的工作分支,进行回滚、清理索引
- $ git checkout feature
- $ git reset --soft HEAD^ ;# go back to WIP state (2)
当已经添加了一个文件进入索引,而后又不打算提交文件时:
$ git reset -- frotz.c (1) 从索引中去除
- $ git tag start
- $ git checkout -b branch1
- $ edit
- $ git commit ... (1) 当前分支下提交
- $ edit
- $ git checkout -b branch2 (2) 发现不该为 branch1 分支,切换
- $ git reset --keep start (3) 撤销 start 之后的提交,工作区不变
用于从工作区和索引中删除文件。
- git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]
- [--quiet] [--] <file> …
从索引中删除文件,或从工作树和索引中删除文件,仅删除物理文件,没有删除记录;
当给出 --cached
时,暂存区内容必须与分支的提示或磁盘上的文件相匹配,从而仅将文件从索引中删除;
-am
删除大批文件记录。
用于移动或重命名文件,目录或符号链接。
git mv <options>… <args>…
- # 重命名 <source>(必须存在) 为 <destination>
- git mv [-v] [-f] [-n] [-k] <source> <destination>
- # 最后一个参数必须是现有的目录; 给定的源(<source>)将被移动到这个目录中。
- git mv [-v] [-f] [-n] [-k] <source> ... <destination directory>
用于列出,创建或删除分支。
- git branch [--color[=<when>] | --no-color] [-r | -a]
- [--list] [-v [--abbrev=<length> | --no-abbrev]]
- [--column[=<options>] | --no-column] [--sort=<key>]
- [(--merged | --no-merged) [<commit>]]
- [--contains [<commit]] [--no-contains [<commit>]]
- [--points-at <object>] [--format=<format>] [<pattern>…]
- git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
- git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
- git branch --unset-upstream [<branchname>]
- git branch (-m | -M) [<oldbranch>] <newbranch>
- git branch (-d | -D) [-r] <branchname>…
- git branch --edit-description [<branchname>]
--list
,列出现有的分支,当前分支以星号突出显示;
-a
,显示本地和远程分支;
-r
,导致远程跟踪分支被列出;
--contains
,仅显示包含命名提交的分支;
<pattern>
,被用作一个 shell 通配符,将输出限制为匹配的分支。提供 <pattern>
时,必须使用 --list
; 否则命令被解释为分支创建。
创建远程分支:
- $ git remote add new-remote-repo https://b.git
- $ git push <new-remote-repo> master
修改分支名:
- $ git branch -m dev2 version.2
- # 列出
- $ git branch -r
删除远程分支:
- $ git push origin --delete branch2
-
- # 删除本地分支
- git branch -d crazy-experiment
合并某个分支到当前分支:
- # 合并分支:version.2到当前分支(master)
- $ git merge version.2
用于切换分支或恢复工作树文件。
- git checkout [-q] [-f] [-m] [<branch>]
- git checkout [-q] [-f] [-m] --detach [<branch>]
- git checkout [-q] [-f] [-m] [--detach] <commit>
- git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
- git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…
- git checkout [-p|--patch] [<tree-ish>] [--] [<paths>…]
更新工作树中的文件以匹配索引或指定树中的版本;
若没给出路径,将会更新 HEAD
,将指定的分支设置为当前的分支。
- $ git checkout master #(1)
- $ git checkout master~2 Makefile #(2) 从另一个提交中取出文件
- $ rm -f hello.c
- $ git checkout hello.c #(3) 从索引中恢复 hello.c
C
源文件(引号):- # 引号指明
- git checkout -- '*.C'
- # 非引号则可能是分支名,则会进行分支切换
- git checkout mytopic
用于将两个或两个以上的开发历史加入(合并)一起。
- git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
- [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
- [--[no-]allow-unrelated-histories]
- [--[no-]rerere-autoupdate] [-m <msg>] [<commit>…]
- git merge --abort
- git merge --continue
将来自命名提交的更改(从其历史中从某一分支转移到当前分支之后);
合并来自另一个存储库的更改,可以手动使用将更改域从一个分支合并到另一个分支。
git merge fixes enhancements
ours
合并策略:get merge -s ours obsolete
- git merge --no-commit maint
- # 去掉 --no-commit 则进行自动新的提交
用于运行合并冲突解决工具来解决合并冲突。
git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…]
通常在git合并后运行;
若有一个或多个 参数,则将用来解决每个文件的差异(跳过无冲突);
指定目录将包含该路径中所有未解析文件;
若没指定,则将在每个有合并冲突的文件上运行。
可以设置 BeyondCompare, DiffMerge 等作为git的比较和合并的可视化工具,方便操作;
下载并安装 BeyondCompare, DiffMerge 等,这里以 BeyondCompare 为例:
- #difftool 配置
- git config --global diff.tool bc4
- git config --global difftool.bc4.cmd "\"./beyond compare 4/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""
-
-
- #mergeftool 配置
- git config --global merge.tool bc4
- git config --global mergetool.bc4.cmd "\"./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 log [<options>] [<revision range>] [[\--] <path>…]
采用适用于 git rev-list
命令的选项来控制显示的内容;
适用于 git diff- *
命令的选项,以控制如何更改每个提交引入的内容。
git log --no-merges
include/scsi
或 drivers/scsi
子目录中的任何文件的所有提交:git log master include/* drivers/*
Cmakelist.txt
( 避免分支混淆):git log --since="2 weeks ago" -- Cmakelist.txt
test
分支中尚未在 release
分支中的提交,以及每个提交修改的路径列表:git log --name-status release..test
builtin/rev-list.c
的提交,包括文件名称设立之前发生的提交:git log --follow builtin/rev-list.c
git log branchename --not --remotes=origin
git log -p -m --first-parent
git log -L '/int main/',/^}/:main.c
- $ git log commit1_id commit2_id #查询commit1与commit2之间的记录,包括两者
- $ git log commit1_id..commit2_id #同上,但是不包括commit1
-
- HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,
- 等同于HEAD~1,HEAD~2代表倒数第二次提交
- --pretty按指定格式显示日志信息,
- 可选项有:oneline,short,medium,full,fuller,email,raw以及format:
- 默认为medium,可以通过修改配置文件来指定默认的方式
常见的 format 选项:
#选项 #说明 %H 提交对象(commit)的完整哈希字串 %h 提交对象的简短哈希字串 %T 树对象(tree)的完整哈希字串 %t 树对象的简短哈希字串 %P 父对象(parent)的完整哈希字串 %p 父对象的简短哈希字串 %an 作者(author)的名字 %ae 作者的电子邮件地址 %ad 作者修订日期(可以用 -date= 选项定制格式) %ar 作者修订日期,按多久以前的方式显示 %cn 提交者(committer)的名字 %ce 提交者的电子邮件地址 %cd 提交日期 %cr 提交日期,按多久以前的方式显示 %s 提交说明
举例:
- $ git log --pretty=format:"%an %ae %ad %cn %ce %cd %cr %s" --graph
- # 指定作者的提交
- $ git log --author=maxsu
- $ git log --before={3,weeks,ago} --after={2018-04-18}
--since
,--affter
- 仅显示指定时间之后的提交(不包含当前日期);
--until
,--before
- 仅显示指定时间之前的提交(包含当前日期)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。