• 1. Git常用命令
  • 2. git rebase
    • 2.1. 合并多余提交记录
    • 2.2. 修改提交记录
  • 3. git设置忽略特殊文件
    • 3.1. 忽略文件的原则
    • 3.2. 设置的方法
    • 3.3. gitignore 不生效解决方法
  • 4. Git分支重命名
  • 5. 代码冲突
  • 6. 修改历史提交的用户信息
  • 7. 撤销已经push的提交

    1. Git常用命令

    分类 子类 git command zsh alias
    分支 查看当前分支 git branch gb
    创建新分支,仍停留在当前分支 git branch
    创建并切换到新分支 git checkout -b gcb
    切换分支 git checkout
    合并分支 git checkout #切换到要合并的分支git merge –no-ff #合并指定分支到当前分支
    提交 查看状态 git status gst
    查看修改部分 git diff —color gd
    添加文件到暂存区 git add —all
    提交本地仓库 git commit -m “
    推送到指定分支 git push -u origin
    查看提交日志 git log -

    2. git rebase

    如果信息修改无法生效,设置永久环境变量:export EDITOR=vim

    帮助信息:

    1. # Rebase 67da308..6ef692b onto 67da308 (1 command)
    2. #
    3. # Commands:
    4. # p, pick = use commit
    5. # r, reword = use commit, but edit the commit message
    6. # e, edit = use commit, but stop for amending
    7. # s, squash = use commit, but meld into previous commit
    8. # f, fixup = like "squash", but discard this commit's log message
    9. # x, exec = run command (the rest of the line) using shell
    10. # d, drop = remove commit
    11. #
    12. # These lines can be re-ordered; they are executed from top to bottom.
    13. #
    14. # If you remove a line here THAT COMMIT WILL BE LOST.
    15. #
    16. # However, if you remove everything, the rebase will be aborted.
    17. #
    18. # Note that empty commits are commented out

    2.1. 合并多余提交记录

    1. #以交互的方式进行rebase
    2. git rebase -i master
    3. #合并多余提交记录:s, squash = use commit, but meld into previous commit
    4. pick 6ef692b FIX: Fix parsing docker image version error
    5. s 3df667y FIX: the second push
    6. s 3fds95t FIX: the third push
    7. 保存退出
    8. # 进入修改交互界面
    9. 删除需要删除的提交记录,保存退出
    10. #查看提交记录是否已被修改
    11. git log
    12. #最后强制提交到分支
    13. git commit --force -u origin fix/add-unit-test-for-global-role-revoking

    2.2. 修改提交记录

    1. #以交互的方式进行rebase
    2. git rebase -i master
    3. #修改提交记录:e, edit = use commit, but stop for amending
    4. e 6ef692b FIX: Fix parsing docker image version error
    5. e 5ty697u FIX: Fix parsing docker image version error
    6. #保存退出
    7. git commit --amend
    8. #修改提交记录内容,保存退出
    9. git rebase --continue
    10. git commit --amend
    11. #修改下一条提交记录,保存退出
    12. git rebase --continue
    13. git status # 查看状态提示
    14. #最后强制提交到分支
    15. git commit --force -u origin fix/add-unit-test-for-global-role-revoking
    16. #查看提交记录是否已被修改
    17. git log

    3. git设置忽略特殊文件

    3.1. 忽略文件的原则

    1. 忽略操作系统自动生成的文件,比如缩略图等;
    2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

    3.2. 设置的方法

    在项目的workdir 下编辑 .gitignore 文件,文件的路径填写为workdir的相对路径。

    1. .idea/ #IDE的配置文件
    2. _build/
    3. server/server #二进制文件

    3.3. gitignore 不生效解决方法

    原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

    1. git rm -r --cached .
    2. git add .
    3. git commit -m 'update .gitignore'

    4. Git分支重命名

    假设分支名称为oldName
    想要修改为 newName

    1. 本地分支重命名(还没有推送到远程)

    1. git branch -m oldName newName

    2. 远程分支重命名 (已经推送远程-假设本地分支和远程对应分支名称相同)
    a. 重命名远程分支对应的本地分支

    1. git branch -m oldName newName

    b. 删除远程分支

    1. git push --delete origin oldName

    c. 上传新命名的本地分支

    1. git push origin newName

    d.把修改后的本地分支与远程分支关联

    1. git branch --set-upstream-to origin/newName

    5. 代码冲突

    1. git checkout master
    2. git pull
    3. git checkout <branch>
    4. git rebase -i master
    5. fix conflict
    6. git rebase --continue
    7. git push --force -u origin <branch>

    6. 修改历史提交的用户信息

    1、克隆并进入你的仓库

    1. git clone --bare https://github.com/user/repo.git
    2. cd repo.git

    2、创建以下脚本,例如命名为rename.sh

    1. #!/bin/sh
    2. git filter-branch --env-filter '
    3. OLD_EMAIL="your-old-email@example.com" #修改参数为你的旧提交邮箱
    4. CORRECT_NAME="Your Correct Name" #修改参数为你新的用户名
    5. CORRECT_EMAIL="your-correct-email@example.com" #修改参数为你新的邮箱名
    6. if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    7. then
    8. export GIT_COMMITTER_NAME="$CORRECT_NAME"
    9. export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    10. fi
    11. if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    12. then
    13. export GIT_AUTHOR_NAME="$CORRECT_NAME"
    14. export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    15. fi
    16. ' --tag-name-filter cat -- --branches --tags

    3、执行脚本

    1. chmod +x rename.sh
    2. sh rename.sh

    4、查看新 Git 历史有没有错误。

    1. #可以看到提交记录的用户信息已经修改为新的用户信息
    2. git log

    5、确认提交内容,重新提交(可以先把rename.sh移除掉)

    1. git push --force --tags origin 'refs/heads/*'

    7. 撤销已经push的提交

    1. # 本地仓库回退到某一版本
    2. git reset -hard <commit-id>
    3. # 强制 PUSH,此时远程分支已经恢复成指定的 commit 了
    4. git push origin master --force