有没有办法恢复提交,以便我的本地副本保持在该提交中所做的更改,但它们在我的工作副本中变为非提交的更改?回滚提交会将您带到上一次提交 - 我希望保留所做的更改,但我将它们提交到了错误的分支。
这还没有推,只是提交了。
答案 0 :(得分:679)
有很多方法可以做到这一点,例如:
如果你 不 公开推送提交:
git reset HEAD~1 --soft
就是这样,您的提交更改将在您的工作目录中,而LAST提交将从您当前的分支中删除。见git reset man
如果您 公开推送(在名为'master'的分支上):
git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )
正常恢复提交并按
git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this intorduces a new coomit (say, it's hash is 86b48ba) which removes changes, introduced in the coomit in question (but those changes are still visible in the history)
git push origin master
现在,如果您希望在工作副本中进行本地更改(“以便本地副本保留在该提交中进行的更改”)时进行这些更改 - 只需使用-no-commit
选项恢复还原提交:< / p>
git revert --no-commit 86b48ba (hash of the revert commit).
我制作了一个小例子:https://github.com/Isantipov/git-revert/commits/master
答案 1 :(得分:10)
如果你推动了更改,你可以undo
并将文件移回舞台而不使用其他分支。
git show HEAD > patch
git revert HEAD
git apply patch
它将创建一个包含最后一个分支更改的补丁文件。然后它还原更改。最后,将补丁文件应用到工作树中。
答案 2 :(得分:3)
2020简单方法:
git reset <commit_hash>
提交要保留的最后一次提交的哈希。
答案 3 :(得分:1)
大多数情况下,这发生在我将更改推送到错误的分支并稍后实现时。在大多数情况下,后续工作都是如此。
git revert commit-hash
git push
git checkout my-other-branch
git revert revert-commit-hash
git push
答案 4 :(得分:0)
在运行这些命令之前,请确保备份您的更改,并将其保存在单独的文件夹中
git checkout branch_name
在您的分支结帐
git merge --abort
中止合并
git状态
中止合并后检查代码的状态
git reset --hard origin / branch_name
这些命令将重置您的更改并使代码与branch_name(分支)代码对齐。
答案 5 :(得分:0)
添加我遵循的步骤,希望对我这样的初学者有所帮助。
下图显示了我已经推送到 bitbucket 中远程分支“A”的提交。
从这 5 次提交中,我想保留最后 2 次提交,但前 3 次提交我希望它们推送到另一个分支“B”。
这些是我遵循的步骤:
内部分支“A”:
import * as React from 'react';
import { Text, View, TextInput } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs';
import { MaterialCommunityIcons } from '@expo/vector-icons';
function HomeScreen() {
const [text, onChangeText] = React.useState("Useless Text");
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Home!</Text>
<TextInput
onChangeText={onChangeText}
value={text}
/>
</View>
);
}
function SettingsScreen() {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Settings!</Text>
</View>
);
}
const Tab = createMaterialTopTabNavigator();
export default function App() {
return (
<NavigationContainer>
<Tab.Navigator tabBarPosition='bottom'
tabBarOptions={{
// style: { position: 'absolute', bottom:0 },
activeTintColor: '#e91e63',
inactiveTintColor: '#ee11ff',
showIcon: true,
indicatorStyle:{
height:0
}
}}>
<Tab.Screen
options={{
tabBarLabel: 'Home',
tabBarIcon: ({ color, size }) => (
<MaterialCommunityIcons name="home" color={color} size={24} />
),
}} name="Home" component={HomeScreen} />
<Tab.Screen
options={{
tabBarLabel: 'Profile',
tabBarIcon: ({ color, size }) => (
<MaterialCommunityIcons name="account" color={color} size={24} />
),
}} name="Settings" component={SettingsScreen} />
</Tab.Navigator>
</NavigationContainer>
);
}
用于 3 个提交中的每一个。例如,d4a3734 是图片中最后一次提交的提交哈希。 (如果您愿意,可以一次还原多个提交 - 请参阅 How to revert multiple git commits?)git revert <commit-hash>
推送之后是这样的:-
现在,我的分支“A”中只有前 2 个提交,这正是我想要的。接下来,结帐到想要的分行。如果是新分支,请使用 git push
。就我而言,我做了 git checkout -b <branchname>
。
内部分支“B”:
我只是挑选了我想要分支“B”的提交。就我而言,我做到了:
git checkout B
对于我还原的那 3 个提交。
(同样,作为例子,git cherry-pick <commit-hash>
其中 d4a3734 是图片中最后一次提交的提交哈希)
答案 6 :(得分:-1)
对于这种情况:“尚未推送,仅提交。” - 如果您使用 IntelliJ (或其他JetBrains IDE)和尚未推送更改,则可以执行下一步操作。
完成。
这将“取消提交”您的更改,并将您的git状态返回到上次本地提交之前的位置。你不会丢失任何改变。