查看提交
如果你用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'