Git
阅读信息
约 873 个字 3 分钟 本页总访问量:加载中... 次
简化版本:上传 MyProject 项目
- 在本地创建项目并初始化 Git 仓库
- 创建文件并提交
- 在 GitHub 上新建一个空仓库
- 将本地仓库连接到 GitHub 仓库
Bash | |
---|---|
- 推送本地内容到 GitHub
注意
如果本地和远程同时对某个文件更改,可能因为 error: Your local changes to the following files would be overwritten by merge 导致无法拉取。
可以按以下方法执行:
git stash
保存本地改动git pull origin main
拉取远程代码git stash pop
恢复本地修改,可能需要手动选择保留哪部分修改
提交
git commit
创建提交
分支
git branch <BranchName>
创建分支git branch A C
在提交 C 的位置上创建分支 Agit checkout <BranchName>
切换分支git checkout -b <BranchName>
创建分支并切换到新分支-
git checkout -b A C
在提交 C 的位置上创建分支 A,并切换到分支 A -
git merge <BranchName>
将 BranchName 合并到 main(当前 checkout 的分支),此时 main 有多个 parent,包含了两个分支的提交记录 git checkout A; git merge main
将 main 合并到 Agit rebase <BranchName>
将当前 checkout 的分支的提交搬运到 BranchName
将 A 合并到 main:
移动
HEAD 总是指向当前分支上最近一次提交记录。分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。
git checkout <Name>
使 HEAD 指向 Name(可以是某个提交,基于哈希值指定提交记录)
相对引用:
使用^
向上移动 1 个提交记录
使用~<num>
向上移动多个提交记录,如~3
git checkout HEAD^
使 HEAD 指向当前 HEAD(一般是最近的提交记录)的 parent-
git checkout HEAD~3
使 HEAD 后退 3 步 -
git branch -f A
强制将分支 A 指向当前 HEAD git branch -f A B
强制让分支 A 指向提交 B 所在的位置-
git branch -f main HEAD~3
将 main 分支强制指向 HEAD 的第 3 级 parent 提交 -
git cherry-pick <CommitName>
将其他分支上的提交 CommitName 复制到当前分支 -
git cherry-pick c2 c4
将 c2,c4 依次复制到当前分支 -
git rebase -i <CommitName>
从 CommitName 的下一个提交开始(不包括它),列出直到当前分支 HEAD 的所有提交,供你在交互式界面(interactive)中编辑、合并、重排、改写等
撤销
git reset HEAD~2
回退 2 个提交记录,但对远程分支无效git revert HEAD
创建更改的提交
远程操作
远程分支命名:远程仓库名/分支名
,远程仓库名默认为origin
。切换到远程分支时,自动进入分离 HEAD 状态。
git clone
复制整个远程仓库,创建一个本地分支,并跟踪远程的同名分支。git fetch
从远程仓库下载本地仓库中缺失的提交记录,并更新远程分支指针(实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态,但不会改变本地仓库的状态)git pull
等价于先git fetch
再git merge
git push
将变更上传到指定的远程仓库,并在远程仓库上合并新提交记录git push origin A
把本地的分支 A 推送到远程仓库 origin(默认),在远程也创建一个同名分支 A
当远程仓库更新后,直接git push
会由于历史偏移而失败。
解决方法:先使工作基于最新的远程分支
git fetch; git rebase o/main; git push
用git fetch
更新了本地仓库中的远程分支,然后用rebase
将我们的工作移动到最新的提交记录下,最后再用 -git push
推送到远程仓库git fetch; git merge o/main; git push
用git fetch
更新了本地仓库中的远程分支,然后合并了新变更到我们的本地分支(为了包含远程仓库的变更),最后我们用git push
把工作推送到远程仓库git pull --rebase
等价于git fetch
和git rebase o/main
git pull
等价于git fetch
和git merge o/main
SSH
以下操作均在终端执行。
cd ~/.ssh
如果报错执行第 2 步,如果不报错执行第 3 步。ssh-keygen -t rsa -b 4096 -C "<邮箱>"
创建 SSH 密钥cd ~/.ssh
再cat id_rsa.pub
复制公钥内容- GitHub -> Settings -> SSH and GPG keys -> New SSH key -> 粘贴
ssh -T git@github.com
检验是否设置成功(第 1 次需输入 yes)git remote -v
检查远程仓库 URLgit remote set-url origin git@github.com:<http的URL>
修改为 SSH 地址- 正常执行 git 操作