我正在进行一个项目,如下所示(提供完整的上下文,以防万一(:
- 在本地机器上进行更改,在
localhost:5000
上进行测试等 git push
更改为github- ssh转换为Linux服务器,
git pull
则将更改转换为运行中的web服务器
为了简单起见,假设我们有一个新的repo,里面只有一个README。Push 2 commit:
提交1
echo "foo" >> README.md
git add -A
git commit -m "Added text 'foo' to README"
git push
提交2
echo "bar" >> README.md
git add -A
git commit -m "Added text 'bar' to README"
git push
现在,我只想将Github上的版本回滚到commit1中的状态,即只有"foo",没有"bar"。
我可以在本地使用进行此操作
git reset --hard HEAD~1
git push origin +master
成功回滚github上的提交2。然而,当我尝试在生产服务器中使用git pull
时,我得到了:
Already up-to-date.
这显然是错误的。
第页。S.如果有人对本地/test/push-to-prod工作流的开发有任何建议,或者对任何其他这样的github最佳实践有任何建议的话,我都会洗耳恭听。请注意,我是唯一一个从事这个项目的人。
撤消本地提交的正确方法是使用git revert <commit_hash>
。这将使您省去使用git reset
的麻烦。
请尝试以下操作。
git revert <hash_of_bar_changes>
git push
ssh <remote>
git pull
所以在我看来,每个特性最好有另一个分支。而不是直接推给大师。以为例,我将遵循的一般工作流程
假设您在主分支上,并且远程的名称是原始
提交1
echo "foo" >> README.md
git checkout -B feature-branch
git add -A
git commit -m "Added text 'foo' to README"
git push origin feature-branch
在第一次提交之后,根据下一次提交的性质,您可以做两件事
1.提交2是功能分支的一部分
提交2
echo "bar" >> README.md
git add -A
git commit -m "Added text 'bar' to README"
git push origin feature-branch
现在,在你从生产服务器上提取之前,你必须将该功能合并到主分支,如下面的
git checkout master
git merge feature-branch
git push origin master
或者你可以在GitHub上提交拉取请求,并在GitHub 上合并
2.commit 2是一项新功能
在这种情况下,在添加commit-2的更改之前,您需要将功能分支合并到master。所以你会先
git checkout master
git merge feature-branch
git push origin master
然后你会结账到一个新的功能分支
git checkout -B new-feature
echo "bar" >> README.md
git add -A
git commit -m "Added text 'bar' to README"
git push origin new-feature
之后,您可以在github上提交一个Pull请求并进行合并,也可以在从生产服务器提取之前在本地进行合并并推送更改。
git checkout master
git merge new-feature
git push origin master
之后,您可以拉动生产服务器上的主分支。
git pull origin master
现在是恢复提交
一旦你执行以下命令
git reset --hard HEAD~1
git push origin +master
所发生的是存储库的状态被重置为CCD_ 7。根据您的生产版本,它比master领先一个提交,因为它已经有master所在的提交(HEAD(,而它还有一个master没有的其他提交。因此,它无法进行更改。
一个简单的解决方法是使用恢复而不是重置
git revert "hash of commit 2"
git push origin master
因为从本质上讲,这会创建一个新的提交,而不会更改以前的提交。因此,master(github/remote(将领先于您的生产,当您拉动时,将应用更改。
当您重置主分支的HEAD
(想想类似指针的东西(时,它指向上一次提交(这意味着最近的提交不会被擦除(
参考
- https://www.pixelstech.net/article/1549115148-git-reset-vs-git-revert
- https://git-scm.com/docs/git-revert
- https://gist.github.com/blackfalcon/8428401