Git
Table of Contents
git merge dev1之后,想要取消这次merge
如果你已经执行了 `git merge dev1` 并且想要撤销这次合并,你可以使用几种不同的方法来实现,具体取决于你是否已经推送了这次合并。
如果合并尚未推送
- **使用 `git reset`**: 如果你只是在本地进行了合并,还没有推送到远程仓库,你可以使用 `git reset` 来撤销合并: ```bash git reset –hard HEAD~1 ``` 这将会把HEAD指针移动到合并之前的提交,并且撤销自那时以来的所有提交。
- **使用 `git revert`**: 如果你想要保留历史记录,但是撤销合并带来的变化,可以使用 `git revert`: ```bash git revert –no-commit HEAD git commit -m "Revert merge from dev1" ``` 这将会创建一个新的提交,它是上一个提交的逆操作。
如果合并已经推送
如果你已经将合并推送到了远程仓库,你需要创建一个新的提交来撤销之前的合并,并且需要强制推送到远程仓库:
- **使用 `git revert`**: 和上面一样,但是这次你需要推送这个 revert 提交: ```bash git revert –no-edit -m 1 HEAD git push origin <your-branch> –force ``` 这里 `<your-branch>` 是你想要推送的分支名。`-m 1 HEAD` 表示这次 revert 将会是一个合并提交,它将撤销之前的合并。
- **使用 `git reset` 然后强制推送**: 如果你确定要撤销这次合并并且不需要保留历史记录,你可以先使用 `git reset`,然后强制推送: ```bash git reset –hard HEAD~1 git push origin <your-branch> –force ``` 请注意,`–force` 参数会覆盖远程分支的历史,这可能会影响其他协作者的工作。在执行这个操作之前,最好通知你的团队成员。
注意事项
- 在使用 `git reset –hard` 时要小心,因为这会重置你的工作目录和索引,未提交的更改将会丢失。
- 在使用 `git push –force` 之前,一定要确保你的团队成员知晓,因为这会重写远程分支的历史。
- 如果你不确定,可以先在一个新的分支上尝试这些操作,以避免潜在的问题。
撤销合并是一个敏感操作,特别是当涉及到已经推送到远程仓库的更改时。确保你了解这些命令的影响,并且在执行之前与你的团队沟通。
更改远程仓库(remote repository)的 URL
git remote set-url origin <new-remote-url> # 验证更改 git remote -v
git clone设置–depth 1之后远程分支丢失
$ git remote set-branches origin 'branch-name' # 如果需要所有的分支信息,那么可以用通配符 $ git remote set-branches origin '*' # 之后再进行一次fetch操作 $ git fetch -v # 等待结束之后通过下面命令就可以看到远程分支了 $ git branch -r # 再切换到和远程分支相同名字的分支上,本地分支创建并且会和远程分支自动关联 $ git checkout dev
添加公钥
- 在~/.ssh 下生成公钥,命名默认(id_rsa)
ssh-keygen -t rsa
- 把 id_rsa.pub内容复制到git仓库中添加ssh公钥里面
- 测试是否添加成功,如果遇到错误,输入ssh -v git@git.coding.net 检查
ssh -T git@github.com *github ssh -T git@git.coding.net *腾讯云
配置github 443端口
- 在~/.ssh/config文件增加以下内容
User itgo666 Host github.com Hostname ssh.github.com IdentityFile ~/.ssh/id_rsa Port 443
git多用户切换
$ ssh-add ~/.ssh/itgo Identity added: /Users/yangceo/.ssh/itgo (/Users/yangceo/.ssh/itgo) $ ssh-add -l 2048 SHA256:JNAht5MeaDsS4yymb15gwWHFB7YXB1e8/U/W4gGMLF4 /Users/yangceo/.ssh/itgo (RSA) $ ssh -T git@github.com Hi maniyaserverdeploy! You've successfully authenticated, but GitHub does not provide shell access.
refusing to merge unrelated histories
$ git pull --allow-unrelated-histories
配置别名
alias git='git --no-pager' *查看配置 git config --list *设置默认user和email git config --global user.name "输入你的用户名" git config --global user.email "输入你的邮箱" *替换默认的user和email git config --global --replace-all user.email "输入你的邮箱" git config --global --replace-all user.name "输入你的用户名" git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
解决 status 中文编码
git config --global core.quotepath false git config --global alias.st status git config --global alias.co checkout git config --global alias.ci commit git config --global alias.br branch git config --global alias.unstage 'reset HEAD' git config --global alias.last 'log -1'
查看git信息
$ git remote -v
创建git仓库:
git init git add README.md git commit -m "first commit" git remote add origin https://github.com/Itgo666/evhcApi.git git push -u origin master git reset <file> * 从暂存区恢复到工作文件 git checkout -- . *丢弃工作区所有修改的内容 git reset --hard commit_id git log --pretty=oneline
Git分支:
查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创建+切换分支:git checkout -b <name> 合并某分支到当前分支:git merge <name> 删除本地分支:git branch -D BranchName 其中-D也可以是--delete,如:git branch --delete BranchName 删除本地的远程分支:git branch -r -D origin/BranchName 远程删除git服务器上的分支:git push origin -d BranchName 其中-d也可以是--delete,如:git push origin --delete BranchName 查看本地分支及追踪的分支:git branch -vv 设置本地分支跟踪远程分支:git branch --set-upstream-to=origin/dev dev 设置本地分支master跟踪origin/<branch>远程分支:git branch --set-upstream-to=origin/<branch> master 有时会遇到git branch -a时总是不出现新的分支或者远程已经没有的分支在本地还有,这时就需要更新下本地的git分支保持和远程分支一致,使用下面命令即可: git remote update origin --prune
注意
- 如果本地分支和远程分支不同名,是追踪不了的
- git push 时,必须指定push到远程哪个分支上,比如本地分支dev2追踪到 origin/dev,那么只能从origin/dev pull更新,而当push时,必须指定,例如:git push origin HEAD:dev
放弃更改
未使用git add
- 可以使用 git checkout – filepath/name (比如: git checkout – readme.md ,不要忘记中间的 “–” ,不写就成了检出分支了!!)。
- 放弃所以的文件修改可以使用 git checkout . 命令。
- 此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。
- 但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。
已经使用了git add
- 可以使用 git reset HEAD filepathname (比如: git reset HEAD readme.md)来放弃指定文件的缓存,放弃所有的缓存可以使用 git reset HEAD . 命令。
- 此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失。
代码改崩,强制用最新代码覆盖本地代码
git fetch --all git reset --hard origin/master git pull //可以省略
- git fetch 指令是下载远程仓库最新内容,不做合并
- git reset 指令把HEAD指向master最新版本
gitignore
eg: 忽略 target
git rm -r --cached target git commit -m "delete target/" git push origin master
打标签
- git tag -a v1.0 -m 'xxx最终版' * 打tag
- git push origin [tagName] * 推送本地tag
- git push origin –tags * 推送本地所有tag
- git tag -n *查看tag(带注释)
- git show v1.0 * 查看某一个tag详细
- git tag -d v0.1.2 *本地删除tag
- git push origin :refs/tags/<tagName> *远端删除 eg: git push origin :refs/tags/v0.1.2
切换到某个tag
跟分支一样,可以直接切换到某个tag去。这个时候不位于任何分支,处于游离状态,可以考虑基于这个tag创建一个分支。 $ git tag 0101 n v1.0.0 $ cat abc.text 1 22 dev_0101 $ git co n Note: checking out 'n'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at 1e77b3b dev 1 $ git tag 0101 n v1.0.0 $ git br *(HEAD detached at n) dev dev_0101 master
实验步骤:
1.新建分支 dev_0101 并在该分支上打标签 tag_0101 2.切换到 master 分支,删除分支 dev_0101 3.切换到 tag_0101 ,当前处于游离状态,该状态下文件内容和删除的 dev_0101 分支下的文件内容一样
小结:
1.删除分支不影响在该分支上打的标签 2.切换到标签后,此时处于游离状态
git rebase
用rebase 代替 merge
- git pull –rebase <=> git rebase ,意思是:把远程更新以变基的方式拉下来,这样 git log 就是一条线,而没有merge产生多条线。
- git pull –rebase <=> git rebase
- 当 git pull 有冲突时,回退到pull之前,用 git rebase 代替
- 当 git commit 有冲突
- 用 git rebase 代替
- 解决冲突
- git rebase –continue
- 再 git push
cherry-pick
// 将指定的提交commitHash,应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。 $ git cherry-pick <commitHash> // Cherry pick 支持一次转移多个提交。 $ git cherry-pick <HashA> <HashB>