From: Duy Nguyen <pclouds@gmail.com>
To: git@vger.kernel.org
Subject: On undoing a forced push
Date: Tue, 9 Jun 2015 19:12:21 +0700 [thread overview]
Message-ID: <20150609121221.GA14126@lanh> (raw)
>From a thread on Hacker News. It seems that if a user does not have
access to the remote's reflog and accidentally forces a push to a ref,
how does he recover it? In order to force push again to revert it
back, he would need to know the remote's old SHA-1. Local reflog does
not help because remote refs are not updated during a push.
This patch prints the latest SHA-1 before the forced push in full. He
then can do
git push <remote> +<old-sha1>:<ref>
He does not even need to have the objects that <old-sha1> refers
to. We could simply push an empty pack and the the remote will happily
accept the force, assuming garbage collection has not happened. But
that's another and a little more complex patch.
Is there any other way to undo a forced push?
-- 8< --
diff --git a/transport.c b/transport.c
index f080e93..6bd6a64 100644
--- a/transport.c
+++ b/transport.c
@@ -657,16 +657,17 @@ static void print_ok_ref_status(struct ref *ref, int porcelain)
"[new branch]"),
ref, ref->peer_ref, NULL, porcelain);
else {
- char quickref[84];
+ char quickref[104];
char type;
const char *msg;
- strcpy(quickref, status_abbrev(ref->old_sha1));
if (ref->forced_update) {
+ strcpy(quickref, sha1_to_hex(ref->old_sha1));
strcat(quickref, "...");
type = '+';
msg = "forced update";
} else {
+ strcpy(quickref, status_abbrev(ref->old_sha1));
strcat(quickref, "..");
type = ' ';
msg = NULL;
-- 8< --
next reply other threads:[~2015-06-09 12:12 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-09 12:12 Duy Nguyen [this message]
2015-06-09 13:17 ` On undoing a forced push Matthieu Moy
2015-06-09 14:06 ` Sitaram Chamarty
2015-06-09 14:25 ` Jeff King
2015-06-09 14:50 ` Sitaram Chamarty
2015-06-09 16:29 ` Johannes Schindelin
2015-06-09 16:55 ` Stefan Beller
2015-06-09 23:24 ` Duy Nguyen
2015-06-09 15:00 ` brian m. carlson
2015-06-10 2:43 ` Duy Nguyen
2015-06-10 12:18 ` brian m. carlson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150609121221.GA14126@lanh \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.