Git常用技巧

1 git pull 下拉分支

拉取data_utility下icu分支,命令:

git clone -b icu https://github.com/xingqiuxia/data-utility.git

报错:Error:RPC failed; result=35, HTTP code = 0

  • 原因是git http缓存不足,问题出现有一定随机性
  • 可通过设置缓存大小解决:git config --global http.postBuffer 20M

2 git push上传文件

  1. git add xxx 添加需要上传的文件 (git add . 表示添加当前目录下的所有文件)
  2. git commit -m '修改内容,做说明注释'
  3. git push origin 本地分支名:远程分支名 本地分支名,可由命令git branch获得,远程分支名是指GitHub上的分支名称

3 拉去主支,并合并到分支

git checkout master # 切换到主支
git pull
git checkout icu_dapeng # 切换到分支
git merge master

4 解决分支冲突

  1. 拉取两个存在冲突的分支 git clone -b (分支项目名) (主项目地址)
  2. 在VScode终端下运行git merge查看冲突
  3. 逐一解决带有黄色叹号标志的冲突
  4. git commit提交,git push origin推送

冲突的解决选择

  • Accept Current Change:选择当前分支(git branch可以查看当前分支,git checkout可以切换分支)
  • Accept lncoming Change:选择当前分支外的另一分支
  • Accept Both Changes:保留两者,以上下形式排列
  • Compare Changes:比较具体的不同点

5 避免文件权限变更引起的修改

执行git diff 命令时出现文本权限的变化:

diff --git a/index.php b/index.php
old mode 100644
new mode 100755

通过设置filemode,避免NTFS文件权限变更引起的修改

git config --add core.filemode false

6 合并上游主分支的更新

当改动较多时慎重合并,并注意处理冲突问题

合并过程:

# 配置上游仓库 
git remote add upstream [email protected]:liangliangyy/DjangoBlog.git
# 上游仓库配置删除:git remote remove upstream
git fetch upstream
# 之后只需要定期更新即可
git merge upstream/master
# 需要细致处理各种冲突

7 撤销不合理的操作

  • 撤销本地尚未提交的修改:git checkout .(谨慎使用)或git restore <file> 恢复单个文件(推荐使用)
  • 撤销添加到暂存区的文件:git reset <file>
  • 撤销最近的一次本地(commit):git reset HEAD^(仅回退,不修改) 或 git reset --hard HEAD^(回退+修改)
  • 撤销第一个本地提交(push):git update-ref -d HEAD && git rm --cached -r .(更新指针+清除暂存区缓存)
  • 撤销本地分支上中间的某次提交:git rebase -i <base-branch>(需要丢弃的记录将 pick 改为 d
  • 撤销本地git rm的文件:git reset HEAD <file> && git checkout <file>
  • 修改最新的提交(commit)信息:git commit --amend(更早期的信息需要使用rebase命令)
  • 撤销本地的merge:git reset --hard HEAD^(merge 操作相当于一次commit,因此用法类似)
  • 撤销本地的rebase:git reset --hard ORIG_HEAD
  • 撤销发生冲突的mergerebasegit commit --abortgit rebase --abort
  • 撤销git pull操作:先用git reflag命令查看之前的操作,再git reset --hard HEAD@{1}
  • 撤销push到远端的最近一次提交:git reset --hard HEAD^ && git push --force(旧版的强制覆盖,谨慎使用)
  • 撤销一个push到远程的分支或者tag:git push origin -d <branch/tag>

以上撤销操作主要参考自视频:【GitFAQ-那些可以反悔的神操作】

8 端口阻塞:Connection timed out

现象:

  • 能 ping 通 github.comssh -T [email protected] 超时
  • 超时报错 ssh: connect to host github.com port 22: Connection timed out

解决方案:

  • 尝试使用 443 端口:ssh -T -p 443 [email protected]
  • 443 端口可用的情况下,修改配置文件 vim ~/.ssh/config
Host github.com
 Hostname ssh.github.com
 Port 443
  • 其他解决方案:改用 https 协议(未尝试)
  • 其他可能原因:防火墙设置、DNS 问题、GitHub 网站问题

9 squash:合并多个commit

  1. 首先确保有两个分支与远程分支是同步的(更直观):master 和 dev
  2. 目的:将 dev 分支下的多个 commit 合并后提交到 master 主分支
  3. 首先在开发分支 dev 下执行 git rebase -i master 进入交互式编辑 git 历史
# 执行上面的语句后,会进入以下编辑界面
pick xxx: commit1 add : add xxx 
Pick xxx: commit 2 fix: update xxxx
Pick xxx: commit 3 fix: delete xxx
Pick xxx: commit 4 modify : update xxxx 
# 进入编辑模式,将除第一行的 pick 外,其余的 pick 都改成 squash 
pick xxx: commit 1 add : add xxx 
squash xxx: commit 2 fix: update xxxx
squash xxx: commit 3 fix: delete xxx
squash xxx: commit 4 modify : update xxxx 
# 最后退出编辑模式,保存即可
  1. squash 操作会将对应的 commit 与上一个 commit 合并
  2. 使用 git push orgin dev: dev -f 将更新强制同步到远程分支
  3. 最后通过 pull requests 提交 dev 远程分支至 master 远程分支

参考:git squash 用法

往年同期文章