我经常使用git,但我对引擎盖下的细节和“git语言”没有非常深刻的理解......
我有两个目录:一个在我的电脑上,一个在我的笔记本电脑上。 两者都包含一个.git存储库(不是裸的!)。
我的笔记本电脑通过ssh连接到我的电脑,从笔记本电脑连接到电脑(添加了ssh遥控器)。
因为我无法推送到已检出的分支机构(在笔记本电脑的电脑上),我在电脑上有两个分支机构(主机和笔记本电脑主机)。 所以我推,然后在电脑上合并分支。
在某种程度上,我搞砸了正确的订单而且我有冲突。
我正在尝试使用git log,git diff(和gitk)进行清理。
为了撤消我使用过的合并
git reset --merge
这个命令有危险吗?
如何撤消对遥控器的拉动或推动?
我是否需要一个“中央”存储库来避免冲突(我认为这意味着一个裸存储库)?
为什么无法推送到已检出的遥控器上的分支? 我可以用一些不危险的方式强制执行此操作吗?
每个提示都很好...... 感谢
答案 0 :(得分:2)
撤消对远程存储库的推送:
git push -f origin HEAD^:master
此命令将在一次提交时回退远程存储库。
要撤消拉动,您可以执行以下操作:
git reset --hard {hash of the last commit before pull}
拥有一个中央裸存储库会很有帮助,但是......它只是另一个git存储库,你可以在其中推送和拉出;
答案 1 :(得分:1)
执行git reset --merge
。
通过对git pull
执行git reset --hard
可以“撤消”git push
拉完之前提交。
git reset
可以通过git
push -f
向您提交来“撤消”
实际上想要在你的本地仓库中,然后通过git config receive.denyCurrentBranch warn
中央存储库将是更标准的设置。
为什么无法推送到已签出的遥控器上的分支?
因为通过某些外部仓库将更改推送到您的存储库中,通常会让您感到困惑。
我可以用一些非危险的方式强制执行此操作吗?
您可以通过在该repo中发出此命令来配置git以允许它(我理解您的pc repo):
git reset --hard
然后您可以将更改推送到已签出的分支。但是,当您切换到pc repo时,您将处于混乱状态,因为这些更改不会反映在工作树中。实际上看起来你已经撤消了这些更改(因为它们在repo中但不在工作树中)。
您可以按git reset HEAD <file>
获取推送的更改,但这会丢弃您拥有的任何本地更改。如果您有本地更改,则必须使用git checkout -- <file>
和C:\git\pc_repo [master]> git config receive.denyCurrentBranch warn
C:\git\pc_repo [master]> cd ..
C:\git> cd .\laptop_repo
C:\git\laptop_repo [master]> echo hello >> text.txt
C:\git\laptop_repo [master]> git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: text.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
C:\git\laptop_repo [master +0 ~1 -0]> git commit -am "modified text"
[master 4925c26] modified text
1 file changed, 2 insertions(+), 1 deletion(-)
C:\git\laptop_repo [master]> git push
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 303 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: warning: updating the current branch
To C:/git/.\pc_repo\.git
eb4f07f..4925c26 master -> master
C:\git\laptop_repo [master]> cd ..
C:\git> cd .\pc_repo
C:\git\pc_repo [master +0 ~1 -0]> git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: text.txt
#
C:\git\pc_repo [master +0 ~1 -0]> git reset --hard
HEAD is now at 4925c26 modified text
C:\git\pc_repo [master]> git status
# On branch master
nothing to commit, working directory clean
C:\git\pc_repo [master]>
这是一个示例,我设置配置,切换到笔记本电脑,进行更改,推送更改,切换到PC,并重置该repo以获取工作树中的更改:
{{1}}