GIT使用详解

Git常用命令

git辅助命令

git config

git config 命令用于获取并设置存储库或全局选项。这些变量可以控制Git的外观和操作的各个方面。

语法简介
C:\Workspace\learn\test-git>git config

Config file location
--global              use global config file
--system              use system config file
--local               use repository config file
-f, --file <file>     use given config file
--blob <blob-id>      read config from given blob object

Action
--get                 get value: name [value-regex]
--get-all             get all values: key [value-regex]
--get-regexp          get values for regexp: name-regex [value-regex]
--get-urlmatch        get value specific for the URL: section[.var] URL
--replace-all         replace all matching variables: name value [value_regex]
--add                 add a new variable: name value
--unset               remove a variable: name [value-regex]
--unset-all           remove all matches: name [value-regex]
--rename-section      rename section: old-name new-name
--remove-section      remove a section: name
-l, --list            list all
-e, --edit            open an editor
--get-color           find the color configured: slot [default]
--get-colorbool       find the color setting: slot [stdout-is-tty]

Type
--bool                value is "true" or "false"
--int                 value is decimal number
--bool-or-int         value is --bool or --int
--path                value is a path (file or directory name)

Other
-z, --null            terminate values with NUL byte
--name-only           show variable names only
--includes            respect include directives on lookup
--show-origin         show origin of config (file, standard input, blob, command line)
描述

可以使用此命令查询、设置、替换、取消设置选项。

git功能命令

git rebase

git rebase 命令在另一个分支基础之上重新应用,用于把一个分支的修改合并到当前分支。官网解释:Reapply commits on top of another base tip

语法简介
usage: git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
     or: git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
     or: git-rebase --continue | --abort | --skip | --edit-todo

Available options are
-v, --verbose         display a diffstat of what changed upstream
-q, --quiet           be quiet. implies --no-stat
--autostash           automatically stash/stash pop before and after
--fork-point          use 'merge-base --fork-point' to refine upstream
--onto ...            rebase onto given branch instead of upstream
-p, --preserve-merges
                      try to recreate merges instead of ignoring them
-s, --strategy ...    use the given merge strategy
--no-ff               cherry-pick all commits, even if unchanged
-m, --merge           use merging strategies to rebase
-i, --interactive     let the user edit the list of commits to rebase
-x, --exec ...        add exec lines after each commit of the editable list
-k, --keep-empty         preserve empty commits during rebase
-f, --force-rebase    force rebase even if branch is up to date
-X, --strategy-option ...
                      pass the argument through to the merge strategy
--stat                display a diffstat of what changed upstream
-n, --no-stat         do not show diffstat of what changed upstream
--verify              allow pre-rebase hook to run
--rerere-autoupdate   allow rerere to update index with resolved conflicts
--root                rebase all reachable commits up to the root(s)
--autosquash         move commits that begin with squash
                      move commits that begin with squash!/fixup! under -i
--committer-date-is-author-date
                      passed to 'git am'
--ignore-date         passed to 'git am'
--signoff             passed to 'git am'
--whitespace ...      passed to 'git apply'
--ignore-whitespace   passed to 'git apply'
-C ...                passed to 'git apply'
-S, --gpg-sign[=...]  GPG-sign commits

Actions:
--continue            continue
--abort               abort and check out the original branch
--skip                skip current patch and continue
--edit-todo           edit the todo list during an interactive rebase
--quit                abort but keep HEAD where it is
  • rebase合并提交记录
    关键字: squash
    关键字说明: 将当前提交与上一次提交合并(注意理解:个人理解为:第二次的提交只能合并到第一次提交上,依此类推)
    为方便说明,我在当前的功能开发分支feature-1,上做三次提交模拟普通开发过程的提交,备注分别是:feature-1 commit-1,feature-1 commit-2,feature-1 commit-3如下图所示:
    feature-1分支的提交记录

下面我们将第2次与第3次的提交合并到第一次的提交上。
首先在idea中打开命令行终端:

命令行终端

1.输入命令:git rebase -i HEAD~3 (3:是指我需要合并最近多少次提交,也就是版本。在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。)

git rebase -i HEAD~3 结果

2.在需要将本次提交合并到上一次提交的记录前将 pick 改为 s 或者 squash(示例是将 提交fcac3ae,5c81594 合并到 feb337b提交上),然后保存(按 Esc 键,输入:wq 回车,合并的过程可能会有冲突):
合并提交操作

3.如果有冲突,需要修改,修改的时候要注意,保留最新的历史,不然我们的修改就丢弃了。修改以后要记得敲下面的命令:
git add ./git/src
git rebase --continue
如果你想放弃这次提交合并的话,执行以下命令:
git rebase --abort

如果没有冲突,会出现编辑提交日的志界面

编写提交日志界面-1

编写提交日志界面-2

4.此时可以使用git log 命令查看提交记录与日志:
git log 命令结果

idea日志记录

5.将合并提交的结果push到远程分支,由于合并提交会更改HEAD信息,所以必须使用强制push
命令:git push -f
image.png

  • rebase合并分支
    关键字: --onto
    关键字说明: 指定新的合并基点
    为方便说明现在我在master上,做3次提交,模拟其他功能已合并到master
    master提交日志

    1.切换到feature-1分支上
    未合并之前**feature-1**分支的提交日志

    2.在控制台输入合并 命令 git rebase master
    git rebase master结果

    IDEA操作

3.这个时候找到有冲突的文件,将冲突解决。然后将有冲突的文件add到git中git add ./git/src

add之后的结果

4.再次查看feature-1的提交日志git log,大家可以看到feature-1的提交,已经是建立在master feature-60000之后了
image.png

5.将rebase之后的feature-1分支push到远程分支,由于合并提交会更改HEAD信息,所以必须使用强制push命令:git push -f

  • rebase修改提交内容
    关键字: edit
    关键字说明: 修改历史提交的数据
    为了方便说明我们还是以feature-1分支作为示例,假设由于某个需求,我需要将 feature-1 commit-1-2-3 的提交数据进行修改,但是此时的feature-1 commit-1-2-3并不是最新版本
    当前最新版本

1.修改历史提交数据之前的日志和数据git log

修改之前的日志和数据

2.使用git rebase -i HEAD~N (N:是指版本数,当然我们这里也就是2。在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。),会出现如下的操作界面
git rebase -i HEAD~2结果

3.将9acd2ff版本号前的pick改为 edit或者s,然后按 Esc键,输入:wq,保存
操作示意图

4.第3步的结果如下
edit结果

5.现在我再最后追加一个输出System.out.println("use rebase edit change committed content"); 和一个文本文件gitamen.txt
修改结果

6.将修改后的文件添加到git中:git add ./git/src

git add ./git/src结果

7.保存对这次提交数据的更改git commit --amend
git commit --amend 结果

8.输入日志并保存(Esc键,输入:wq
结果

9.执行git rebase --continue命令
git rebase --continue 结果

10.解决冲突,再依此执行git add ./git/srcgit rebase --continue这时不需要提交,也就是不需要在执行git commit --amend,如果在中途要停止rebase操作,请执行命令git rebase --abort,这样就可以抹去并停止在rebase的操作。
填写日志

结果

11.查看提交记录git log
image.png

12.push到远程分支,由于合并提交会更改HEAD信息,所以必须使用强制push命令:git push -f

  • rebase批量修改历史提交日志
    关键字: reword
    关键字说明: 修改历史提交信息
    为了方便说明我们还是以feature-1分支作为示例,现在的需求是将日志信息feature-1 edit-commit,add gitamen.txt file,change Git.java改为feature-1 reword committed log
    1.执行命令git rebase -i HEAD~1
    image.png

    git rebase -i HEAD~1 结果

    2.将 8496384 前的 pick 改为 r 或者 reword。然后按 Esc键,输入:wq,保存
    image.png

    3.填写新的提交日志信息feature-1 reword committed log。然后按 Esc键,输入:wq,保存
    更改提交日志

    4.查看提交日志 git log
    日志信息

    5.将结果push到远程分支,由于合并提交会更改HEAD信息,所以必须使用强制push命令:git push -f
  • rebase删除历史纪录
    关键字: drop 或者 直接删除所在的行
    关键字说明: 删除历史提交记录
    为了方便说明我们还是以feature-1分支作为示例,现在的需求是将feature-1 reword committed logfeature-1 commit-1-2-3 add a new file , modify Git.java对应的提交删除。
    原始的提交记录如下
    原始记录

1.执行命令git rebase -i HEAD~2

image.png

2.在需要删除的版本前将pick 改为 drop 或者 d 或者 直接删除所在的行。然后按 Esc键,输入:wq,保存
image.png

3.查看日志git log
image.png

4.将结果push到远程分支,由于合并提交会更改HEAD信息,所以必须使用强制push命令:git push -f

git stash

git stash 命令用于将更改储藏在脏工作目录中。官网解释:Stash the changes in a dirty working directory away

语法简介
C:\Workspace\learn\test-git>git stash usage
usage: git stash list [<options>]
 or: git stash show [<stash>]
 or: git stash drop [-q|--quiet] [<stash>]
 or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
 or: git stash branch <branchname> [<stash>]
 or: git stash save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
                  [-u|--include-untracked] [-a|--all] [<message>]
 or: git stash [push [--patch] [-k|--[no-]keep-index] [-q|--quiet]
                   [-u|--include-untracked] [-a|--all] [-m <message>]
                   [-- <pathspec>...]]
 or: git stash clear

暂时写到这儿,有空再更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • 等待是你的胃在思春 文/查老猫 我以为我在等你,可是我不说。 你以为你在等我说,你也不说。...
    查老猫阅读 537评论 1 9
  • 回了趟老家,那些从前的老房子还在。 只是人感觉好少。从前在路边招呼我进屋休息喝水的老人也不在了。 ...
    陈漫漫阅读 588评论 2 2
  • 在创建了一个简单的图片浏览网站(点击图片跳转页面显示)之后,需要考虑:1.当点击某个链接时,我希望能留在这个网页而...
    HeroMeikong阅读 1,005评论 0 0
  • 爱你的人生怕给你的不够,不爱你的人生怕你要求的太多! 爱你的人入眼、入心、入痴……而不爱你的人大都有这两个特点: ...
    须容星阅读 271评论 0 0