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 "

移除一个文件

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 
# OR
git stash push -m 

使用某个指定暂存

# 查看你的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 
git push  :refs/tags/

恢复已删除标签(tag)

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

文件

修改文件名

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'

你可能感兴趣的:(git 经典应用场景)