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上传文件
git add xxx
添加需要上传的文件 (git add .
表示添加当前目录下的所有文件)git commit -m '修改内容,做说明注释'
git push origin 本地分支名:远程分支名
本地分支名,可由命令git branch
获得,远程分支名是指GitHub上的分支名称
3 拉去主支,并合并到分支
git checkout master # 切换到主支
git pull
git checkout icu_dapeng # 切换到分支
git merge master
4 解决分支冲突
- 拉取两个存在冲突的分支
git clone -b (分支项目名) (主项目地址)
- 在VScode终端下运行
git merge
查看冲突 - 逐一解决带有黄色叹号标志的冲突
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
- 撤销发生冲突的
merge
或rebase
:git commit --abort
或git 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.com
但ssh -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
- 首先确保有两个分支与远程分支是同步的(更直观):master 和 dev
- 目的:将 dev 分支下的多个 commit 合并后提交到 master 主分支
- 首先在开发分支
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
# 最后退出编辑模式,保存即可
squash
操作会将对应的 commit 与上一个 commit 合并- 使用
git push orgin dev: dev -f
将更新强制同步到远程分支 - 最后通过 pull requests 提交 dev 远程分支至 master 远程分支