github:将master上的最后一次提交恢复到生产



我正在进行一个项目,如下所示(提供完整的上下文,以防万一(:

  1. 在本地机器上进行更改,在localhost:5000上进行测试等
  2. git push更改为github
  3. 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

最新更新