git 经典应用场景

查看提交

如果你用git commit -a提交了一次变化(changes),而你又不确定到底这次提交了哪些内容。你就可以用下面的命令显示当前HEAD上的最近一次的提交(commit):

(main)$ git show
或者
$ gitlog-n1 -p

修改提交信息

提交信息(commit message)写错了且这次提交(commit)还没有推(push), 你可以通过下面的方法来修改提交信息(commit message):

$ git commit --amend --only  # 打开默认编辑器
或者
$ git commit --amend --only -m 'xxxxxxx' # 编辑信息一次完成

修改用户名和邮箱

git commit --amend --author "New Authorname <authoremail@mydomain.com>"

移除一个文件

git checkout HEAD^ myfile
git add -A
git commit --amend

删除最后一次提交

删除推了的提交(pushed commits),你可以使用下面的方法。这会不可逆的改变你的历史,也会搞乱那些已经从该仓库拉取(pulled)了的人的历史。

git reset HEAD^ --hard
git push -f [remote] [branch]

没有推到远程, 可以把Git重置(reset)到最后一次提交前的状态(同时保存暂存的变化):

git reset --soft HEAD@{1}

删除任意提交(commit)

警告:不到万不得已的时候不要这么做.

git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT
git push -f [remote] [branch]

修改之前的提交需要强制推送

rebasing(见下面)和修正(amending)会用一个新的提交(commit)代替旧的, 如果之前已经往远程仓库上推过一次修正前的提交(commit),就必须强推(force push) (-f)。
注意 – 确保指明一个分支!

 git push origin mybranch -f

做了一次重置,找回内容

意外的做了 git reset --hard, 通常能找回自己的提交(commit), 因为Git对每件事都会有日志,并且会保存几天。

git reflog

显示过去提交(commit)的列表,选择需要回到的版本(commit)的SHA,重置一次:

git reset --hard SHA1234e

暂存

添加到上一次提交

git commit --amend

暂存一个文件的一部分:

git add --patch filename.x  #暂存文件的一部分
git add -N filename.x #添加新文件
git diff --cached # 显示哪些行只是保存在本地

文件变化添加到两个提交里

git add #会把整个文件加入到一个提交. 
git add -p #允许交互式的选择你想要提交的部分.

暂存、未暂存变更

git commit -m "WP" #将所有的内容变为未暂存 
git add .
git stash # 暂存你的未暂存的内容并进行stash
git reset HEAD^  #最后一个commit将原本暂存的内容变为未暂存,最后stash pop回来
git stash pop --index 0

注意1: 使用pop仅仅是因为想尽可能保持幂等。
注意2: 假如不加上--index会把暂存的文件标记为存储。

未暂存

移动到新分支

git checkout -b my-newbranch

移动到已存在分支

 git stash
git checkout my-branch
git stash pop

丢弃未提交的变化

重置源(origin)和你本地(local)之间的一些提交(commit):

# one commit
git reset --hard HEAD^
# two commits
git reset --hard HEAD^^
# four commits
git reset --hard HEAD~4
# or
git checkout -f

重置某个特殊的文件

git reset filename

丢弃未暂存的内容

git checkout -p
或者
git stash -p
git reset --hard
git stash pop
或
git stash -p
git stash drop

分支

错误拉取处理

git reflog # 查询head指向
git reset --hard c5vb5a # 重置分支

删除本地提交,回复本地分支和远程分支一致

# 显示提前(ahead)源(origin)多少个提交
git status
# resest
git reset --hard origin/my-branch

创建新分支

git branch my-branch # 创建新分支
git checkout my-branch # 签出新分支工作

提交到不同分支

git log # 查看提交日志
# 重置正确分支
git reset --hard aqwe8re
# 创建bug修复分支
git checkout -b bug21
# 提交修复
git cherry-pick edf52e8

删除远程仓库已经删除的分支

git fetch -p

恢复删除的分支

git reflog
git checkout -b my-branch-del

删除一个远程分支

git push origin --delete my-branch
# OR
git push origin :my-branch

删除本地分支

git branch -D my-branch

拉取远端分支

# 拉取远端所有分支
git fetch --all
# 远程my-branch分支签出到本地my-branch
git checkout --track origin/my-branch

rebasing 和 merging

撤销rebase/merge

git reset --hard ORIG_HEAD

已经rebase,不进行强推

git checkout my-branch
git rebase -i main
git checkout main
git merge --ff-only my-branch

安全合并

--no-commit 执行合并(merge)但不自动提交, 做提交前检查和修改的机会。
no-ff 为特性分支(feature branch)的存在过留下记录, 保持项目历史一致

 git merge --no-ff --no-commit my-branch

分支合并成一个提交

git merge --squash my-branch

组合(combine)未推的提交(unpushed commit)

git rebase -i @{u}

检查分支上的所有提交(commit)都合并(merge)过

git log --graph --left-right --cherry-pick --oneline HEAD...feature/dev-scroll
# OR 
git log main ^feature/dev-scroll --no-merges

rebase 问题

编辑屏幕出现'noop'
意味着你rebase的分支和当前分支在同一个提交(commit)上, 或者 领先(ahead) 当前分支。你可以尝试:

检查确保主(main)分支没有问题
rebase HEAD~2 或者更早

解决冲突

1、查询冲突:
git status
2、差异查看
git mergetool -t opendiff
3、修改变化文件
git add changed.xx
git rebase --continue
#任何时候想结束整个rebase 过程,回来rebase前的分支状态:
git rebase --abort

Stash

暂存所有改动

git stash
git stash -u # -u来排除一些文件

暂存指定文件

# 暂存一个文件
git stash push  path/filename.x
# OR 暂存多个文件
git stash push  path/filename.x path/filename2.x

暂存记录

git stash save <message>
# OR
git stash push -m <message>

使用某个指定暂存

# 查看你的stash记录
git stash list
# apply某个stash
git stash apply "stash@{n}"
# or
git stash apply "stash@{2.hours.ago}"

保留未暂存的内容

 git stash create
git stash store -m "commit-message" CREATED_SHA1

克隆所有子模块

git clone --recursive git://github.com/xxx/xxx.git
git submodule update --init --recursive

删除标签(tag)

git tag -d <tag_name>
git push <remote> :refs/tags/<tag_name>

恢复已删除标签(tag)

# 找到无法访问的标签
git fsck --unreachable | grep tag
git update-ref refs/tags/<tag_name> <hash>

文件

修改文件名

git mv --force myfile MyFile

Git删除一个文件,但保留该文件

git rm --cached log.txt

配置

缓存一个仓库(repository)的用户名和密码

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

推荐阅读更多精彩内容