当前位置:   article > 正文

Git(六):基本命令(2):复位、修改、分支合并与日志_git查看一个分支创建以后的修改,哪些是修改的,哪些是合并版本

git查看一个分支创建以后的修改,哪些是修改的,哪些是合并版本

目录

9、reset 复位

9.1 描述

9.2 基本用法

9.2.1 回滚添加操作

9.2.2 回滚最近一次提交

9.2.3 回滚最近几次提交

9.2.4 回滚 pull

9.2.5 回滚 merge

9.2.6 区别

9.2.7 中断的工作流程处理

9.2.8 重置单独的文件

9.2.9 保留工作区并丢弃之前的提交

10、rm 删除

10.1 描述

11、mv 移动命名

11.1 描述

12、branch 分支

12.1 描述

12.2 基本用法

13、checkout 切换恢复

13.1 描述

13.2 基本用法

14、merge 合并

14.1 描述

14.2 基本用法

15、mergetool 合并冲突解决工具

15.1 描述

15.2 基本用法

16、log 日志

16.1 描述

16.2 基本用法


9、reset 复位

    用于将当前 HEAD 复位到指定状态。一般用于撤销之前的一些操作(如:git add,git commit等)。

  1. git reset [-q] [<tree-ish>] [--] <paths>…​
  2. git reset (--patch | -p) [<tree-ish>] [--] [<paths>…​]
  3. git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

9.1 描述

  • 在第一和第二种形式中,将条目从 <tree-ish> 复制到索引。

  • 在第三种形式中,将当前分支头( HEAD )设置为 <commit>,可选择修改索引和工作树进行匹配。

  • 所有形式的 <tree-ish>/<commit> 默认为 HEAD

9.2 基本用法

    将当前的分支重设到指定的 commit 或者 HEAD(默认),并根据 [mode] 有可能更新索引或工作目录。

[mode] : hardsoftmixedmergedkeep

git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
  • --hard:重设(reset) 索引和工作目录,自从<commit> 以来在工作目录中的任何改变都被丢弃,并把HEAD指向 <commit>

9.2.1 回滚添加操作

  1. $ edit file1.c file2.c # (1)
  2. $ git add file1.c file1.c # (1.1) 添加两个文件到暂存
  3. $ mailx # (2)
  4. $ git reset # (3)
  5. $ git pull git://info.example.com/ nitfol # (4) 自动合并,改变仍在工作目录

9.2.2 回滚最近一次提交

  1. $ git commit -a -m "这是提交的备注信息"
  2. $ git reset --soft HEAD^ #(1) HEAD^ 表示指向 HEAD 之前最近的一次提交
  3. $ edit code #(2) 编辑代码操作
  4. $ git commit -a -c ORIG_HEAD #(3)

git commit 命令中 -a参数的意思是告诉git,自动把所有修改的和删除的文件都放进暂存区,未被git跟踪的新建的文件不受影响。

commit命令中-c <commit> 或者 -C <commit>意思是拿已经提交的对象中的信息(作者,提交者,注释,时间戳等)提交。

9.2.3 回滚最近几次提交

  1. $ git branch topic/wip (1)
  2. $ git reset --hard HEAD~3 (2) 回滚最近三次提交(删除 HEAD, HEAD^, HEAD~2)
  3. $ git checkout topic/wip (3)

9.2.4 回滚 pull

  1. $ git pull (1)
  2. $ git reset --hard (2)
  3. $ git pull . topic/branch (3) 将 topic/branch 分支合并到当前的分支
  4. ,合并后的更改自动提交
  5. $ git reset --hard ORIG_HEAD (4) 把reset之前的HEAD放入.git/ORIG_HEAD文件中*

9.2.5 回滚 merge

$ git reset --merge ORIG_HEAD      (2)    

git reset --hard ORIG_HEAD 回滚到 pull 之前的状态,同时清空工作区 add 的改变,为了避免丢弃工作区的内容,将 --hard 改成 --merge ,这样可以避免丢失。

9.2.6 区别

  • git reset –-soft:回退到某个版本,只回退了 commit 的信息,不会恢复到 index file 一级。如果还要提交,直接 commit 即可;

  • git reset -–hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的 commit 中所包含的更改被冲掉。

9.2.7 中断的工作流程处理

    在工作分支 feature 下,当正在修改文件内容但又未完全处理完时,需要到另一分支 master 上去修改其他文件所存在的 bug ,我们可以这么做:

  1. # 工作分支下暂时先提交修改
  2. $ git checkout feature
  3. $ ...
  4. $ git commit -a -m "snapshot WIP" (1)
  5. # 切换指定分支进行修改并提交
  6. $ git checkout master
  7. $ ...
  8. $ git commit
  9. # 回到原来的工作分支,进行回滚、清理索引
  10. $ git checkout feature
  11. $ git reset --soft HEAD^ ;# go back to WIP state (2)

9.2.8 重置单独的文件

    当已经添加了一个文件进入索引,而后又不打算提交文件时:

$ git reset -- frotz.c                      (1) 从索引中去除 

9.2.9 保留工作区并丢弃之前的提交

  1. $ git tag start
  2. $ git checkout -b branch1
  3. $ edit
  4. $ git commit ... (1) 当前分支下提交
  5. $ edit
  6. $ git checkout -b branch2 (2) 发现不该为 branch1 分支,切换
  7. $ git reset --keep start (3) 撤销 start 之后的提交,工作区不变

10、rm 删除

    用于从工作区和索引中删除文件。

  1. git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]
  2. [--quiet] [--] <file> …

10.1 描述

  • 从索引中删除文件,或从工作树和索引中删除文件,仅删除物理文件,没有删除记录;

  • 当给出 --cached 时,暂存区内容必须与分支的提示或磁盘上的文件相匹配,从而仅将文件从索引中删除;

  • -am 删除大批文件记录。

11、mv 移动命名

    用于移动或重命名文件,目录或符号链接。

git mv <options><args>

11.1 描述

  1. # 重命名 <source>(必须存在) 为 <destination>
  2. git mv [-v] [-f] [-n] [-k] <source> <destination>
  3. # 最后一个参数必须是现有的目录; 给定的源(<source>)将被移动到这个目录中。
  4. git mv [-v] [-f] [-n] [-k] <source> ... <destination directory>

12、branch 分支

    用于列出,创建或删除分支

  1. git branch [--color[=<when>] | --no-color] [-r | -a]
  2. [--list] [-v [--abbrev=<length> | --no-abbrev]]
  3. [--column[=<options>] | --no-column] [--sort=<key>]
  4. [(--merged | --no-merged) [<commit>]]
  5. [--contains [<commit]] [--no-contains [<commit>]]
  6. [--points-at <object>] [--format=<format>] [<pattern>…​]
  7. git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
  8. git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
  9. git branch --unset-upstream [<branchname>]
  10. git branch (-m | -M) [<oldbranch>] <newbranch>
  11. git branch (-d | -D) [-r] <branchname>
  12. git branch --edit-description [<branchname>]

12.1 描述

  • --list,列出现有的分支,当前分支以星号突出显示;

  • -a,显示本地和远程分支;

  • -r,导致远程跟踪分支被列出;

  • --contains,仅显示包含命名提交的分支;

  • <pattern>,被用作一个 shell 通配符,将输出限制为匹配的分支。提供 <pattern>时,必须使用 --list ; 否则命令被解释为分支创建。

12.2 基本用法

  • 创建远程分支:

    1. $ git remote add new-remote-repo https://b.git
    2. $ git push <new-remote-repo> master
  • 修改分支名:

    1. $ git branch -m dev2 version.2
    2. # 列出
    3. $ git branch -r
  • 删除远程分支:

    1. $ git push origin --delete branch2
    2. # 删除本地分支
    3. git branch -d crazy-experiment
  • 合并某个分支到当前分支:

    1. # 合并分支:version.2到当前分支(master)
    2. $ git merge version.2

13、checkout 切换恢复

    用于切换分支或恢复工作树文件。

  1. git checkout [-q] [-f] [-m] [<branch>]
  2. git checkout [-q] [-f] [-m] --detach [<branch>]
  3. git checkout [-q] [-f] [-m] [--detach] <commit>
  4. git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
  5. git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…​
  6. git checkout [-p|--patch] [<tree-ish>] [--] [<paths>…]

13.1 描述

  • 更新工作树中的文件以匹配索引或指定树中的版本;

  • 若没给出路径,将会更新 HEAD ,将指定的分支设置为当前的分支。

13.2 基本用法

  • 将文件还原为两个修订版本,取回错误删除的文件:
  1. $ git checkout master #(1)
  2. $ git checkout master~2 Makefile #(2) 从另一个提交中取出文件
  3. $ rm -f hello.c
  4. $ git checkout hello.c #(3) 从索引中恢复 hello.c
  • 检索所有的 C 源文件(引号):
  1. # 引号指明
  2. git checkout -- '*.C'
  3. # 非引号则可能是分支名,则会进行分支切换
  4. git checkout mytopic

14、merge 合并

    用于将两个或两个以上的开发历史加入(合并)一起。

  1. git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
  2. [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
  3. [--[no-]allow-unrelated-histories]
  4. [--[no-]rerere-autoupdate] [-m <msg>] [<commit>…​]
  5. git merge --abort
  6. git merge --continue

14.1 描述

  • 将来自命名提交的更改(从其历史中从某一分支转移到当前分支之后);

  • 合并来自另一个存储库的更改,可以手动使用将更改域从一个分支合并到另一个分支。 

14.2 基本用法

  • 合并分支 fixes 和 enhancements 在当前分支的顶部
git merge fixes enhancements
  • 合并 obsolete 分支到当前分支,使用 ours 合并策略
get merge -s ours obsolete
  • 合并 maint 分支到当前分支,但不自动进行新的提交
  1. git merge --no-commit maint
  2. # 去掉 --no-commit 则进行自动新的提交

15、mergetool 合并冲突解决工具

    用于运行合并冲突解决工具来解决合并冲突。

git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…]

15.1 描述

  • 通常在git合并后运行;

  • 若有一个或多个 参数,则将用来解决每个文件的差异(跳过无冲突);

  • 指定目录将包含该路径中所有未解析文件;

  • 若没指定,则将在每个有合并冲突的文件上运行。

15.2 基本用法

  • 可以设置 BeyondCompare, DiffMerge 等作为git的比较和合并的可视化工具,方便操作;

  • 下载并安装 BeyondCompare, DiffMerge 等,这里以 BeyondCompare 为例:

  1. #difftool 配置
  2. git config --global diff.tool bc4
  3. git config --global difftool.bc4.cmd "\"./beyond compare 4/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""
  4. #mergeftool 配置
  5. git config --global merge.tool bc4
  6. git config --global mergetool.bc4.cmd "\"./beyond compare 4/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""
  7. git config --global mergetool.bc4.trustExitCode true
  8. #让git mergetool不再生成备份文件(*.orig)
  9. git config --global mergetool.keepBackup false
  • 比较当前修改情况:
git difftool HEAD

16、log 日志

    用于显示提交日志信息。

git log [<options>] [<revision range>] [[\--] <path>…]

16.1 描述

  • 采用适用于 git rev-list 命令的选项来控制显示的内容;

  • 适用于 git diff- * 命令的选项,以控制如何更改每个提交引入的内容。

16.2 基本用法

  • 显示整个提交历史记录,同时跳过合并:
git log --no-merges
  • 显示自某个版本以来所有提交更改 include/scsidrivers/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
  • 显示文件 main.c 中的函数 main( ) 随着时间推移的变化:
git log -L '/int main/',/^}/:main.c
  • 根据 ID 查询日志:
  1. $ git log commit1_id commit2_id #查询commit1commit2之间的记录,包括两者
  2. $ git log commit1_id..commit2_id #同上,但是不包括commit1
  3. HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,
  4. 等同于HEAD~1,HEAD~2代表倒数第二次提交
  5. --pretty按指定格式显示日志信息,
  6. 可选项有:oneline,short,medium,full,fuller,email,raw以及format:
  7. 默认为medium,可以通过修改配置文件来指定默认的方式

常见的 format 选项:

  1. #选项 #说明
  2. %H 提交对象(commit)的完整哈希字串
  3. %h 提交对象的简短哈希字串
  4. %T 树对象(tree)的完整哈希字串
  5. %t 树对象的简短哈希字串
  6. %P 父对象(parent)的完整哈希字串
  7. %p 父对象的简短哈希字串
  8. %an 作者(author)的名字
  9. %ae 作者的电子邮件地址
  10. %ad 作者修订日期(可以用 -date= 选项定制格式)
  11. %ar 作者修订日期,按多久以前的方式显示
  12. %cn 提交者(committer)的名字
  13. %ce 提交者的电子邮件地址
  14. %cd 提交日期
  15. %cr 提交日期,按多久以前的方式显示
  16. %s 提交说明

举例:

  1. $ git log --pretty=format:"%an %ae %ad %cn %ce %cd %cr %s" --graph
  2. # 指定作者的提交
  3. $ git log --author=maxsu
  4. $ git log --before={3,weeks,ago} --after={2018-04-18}
  • --since--affter - 仅显示指定时间之后的提交(不包含当前日期);

  • --until--before - 仅显示指定时间之前的提交(包含当前日期)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/466680
推荐阅读
相关标签
  

闽ICP备14008679号