git 撤销已经提交到远程服务器的commit
git log
git stash #保留现场
git reset --hard commitId
git push origin HEAD --force
git stash pop #恢复现场
git log
git stash #保留现场
git reset --hard commitId
git push origin HEAD --force
git stash pop #恢复现场
git conflict 是日常协作中必不可少的。
在gitlab的web页面上,有三种处理conflict的视图,其中line的文本方式最灵活。
这种方式中:
其中<<<<<<< HEAD 到 ======= 中间的内容是local提交的。
======= 到 >>>>>>> commit-id 是远程仓库中的内容。
示例:
<<<<<<< HEAD
新提交的代码xxx
=======
远程仓库的代码xxx
>>>>>>> commit-id
svn迁移git是一个很常见的需求。
大部分人希望保留详细的提交记录,因为提交记录是代码版本管理的核心价值。
svn log 远程SVN仓库地址 -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2"="$2" <"$2"@xxx.com>"}' | sort -u > ./users.txt
git svn clone 远程SVN仓库地址 --no-metadata --authors-file=users.txt GitProject
, gitproject 是一个空的目录,表示git项目名称。cd GitProject
git remote -v
,如果不为空,则删除原有origin:git remote rm origin
git remote add origin git@x.x.x.x/project-name.git
git push -u -f origin master
在clone中断时,我们尝试再次执行clone命令,提示了如下的内容:Using existing [svn-remote "svn"] svn-remote.svn.fetch already set to track :refs/remotes/git-svn
解决:进入git目录,执行 git svn fetch
,继续代码的clone行为。
如果提示不支持 git svn,请安装 git-svn
在执行的过程中提示APR does not understand this error code: ra_serf: An error occurred during decompression at /usr/share/perl5/Git/SVN/Ra.pm
这个问题比较棘手,前后尝试了将近2天,刚开始以为仓库代码太大,几十G,大文件不稳定导致,所以尝试了好多次,后面google了下,感觉跟版本有关,又受限于服务器配置不能改,有点无奈。后面在windows中尝试,系统莫名重启,继续在ubuntu20中,才成功。
出问题的环境版本
ubuntu:14.04.3
git: git version 1.9.1
OK的环境
ubuntu:ubuntu1~20.04
Git:git version 2.25.1
在git push时,错误提示如下:
remote: GitLab: You are not allowed to force push code to a protected branch on this project.To git@xxx:xxx.git
! [remote rejected] master -> master (pre-receive hook declined)
error: 无法推送一些引用到 'git@xxx:xxx.git'
关键内容就是protected branch,所以我们需要确认是怎么protected。
repo->settings->repository->protected branches:
10054是认证的错误,跟本地的git账户信息,token机制等相关。
解决:
git config --global user.name "xxx"
git config --global user.email "xxx"
ipconfig /flushdns
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fix:
git remote set-url origin https://tokenj@github.com/username/reponame.git/
方法1:
git reset --soft HEAD^
这样就成功撤销了commit,如果想要连着add也撤销的话,–soft改为–hard(删除工作空间的改动代码)。
命令详解:
HEAD^ 表示上一个版本,即上一次的commit,也可以写成HEAD~1
如果进行两次的commit,想要都撤回,可以使用HEAD~2
–soft
不删除工作空间的改动代码 ,撤销commit,不撤销git add file
–hard
删除工作空间的改动代码,撤销commit且撤销add
方法2:
git commit --amend
进入vim后,正常编辑后wq退出
使用git日常免不了遇到conflicts,那么如何消除conflicts呢,以下的内容以一个具体的过程来讲解整个过程和原理。
以下我们手动创造一个conflicts:
Step 1: From your project repository, check out a new branch and test the changes.
git checkout -b apache-master master
git pull https://github.com/apache/incubator-apisix.git master
Step 2: Merge the changes and update on GitHub.
git checkout master
git merge --no-ff apache-master
git push origin master
以上的的例子, 我们从A合入到B:B <== A。
A: https://github.com/apache/incubator-apisix.git
B: xxxx/incubator-apisix.git
例子中有一个README.md的冲突,并且给出了解决的命令行参考。
我们将逐条命令来解释如何按照提示解决冲突。
From https://github.com/apache/incubator-apisix
* branch master -> FETCH_HEAD
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
$ git commit -m "resolve the conflict"
[apache-master 6ad2d5e] resolve the conflict
最终解决了冲突,完成了对B master的更新。
希望以上就解释清楚,谢谢!