git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: disallowing push to currently checked-out branch

From
Jeff King <peff@peff.net>
Date
Feb 16, 2009, 22:43 UTC
Message-ID
<20090216224330.GA23764@sigill.intra.peff.net>
In-Reply-To
<7vprhidpnc.fsf@gitster.siamese.dyndns.org>
On Mon, Feb 16, 2009 at 01:43:03PM -0800, Junio C Hamano wrote:
Show 8 quoted lines
> Sergio Callegari <sergio.callegari@gmail.com> writes:
> 
> > ... is there some case where one wants
> > and has reasons to commit to a detached head before making a temporary
> > branch on it?
> 
> Absolutely. I do it all the time for minor fix-ups after applying other's
> patches on a newly created topic branch.

This question got me thinking. At the time that detached HEAD was introduced, I argued for a loud warning message, claiming that for most users, commiting on a detached HEAD was dangerous and unintentional and there _should_ be a big warning message. And like then, committing on a detached HEAD is still not something I generally do.

But then I realized there is actually one time: during interactive rebase, which detaches HEAD during the rebase processs, and then puts the final detached value back into the branch ref for you (or not, if you abort).

Which made me think how such a process interacts with pushing into a non-bare repo. If we are detached, the push cannot, by definition, touch the ref pointed to by HEAD, since ther isn't one. But there is still some sense of "current branch" recorded by rebase; after the rebase is completed, it attempts to put a new value in the ref.

So this is still some conflict possible even with the current safety valves. Fortunately, the ref update is smart enough to realize the value has changed behind our back:

  $ git rebase --continue
  error: Ref refs/heads/master is at 5836aa51b217a1c88f32107cbcd606bece018657 but expected d2d7bf3fcaa927ef997dbcdaf9d9a9e176d6a8d0
  fatal: Cannot lock the ref 'refs/heads/master'.

But that doesn't give any hint to the user about what happened, or how to fix it.

So:
  1. How can we improve this situation?
     One option is including "the branch we are rebasing on" in the list
     of refs to deny. I don't like that, though, because that becomes an
     ever-growing list of places for receive-pack to look, some of which
     are not even part of core git.
     I think the best bet is just detecting the situation (which we
     already do) and giving a sane recipe for resolution. Probably
     something like:
        git branch incoming master ;# stash newly pushed changes
        git branch -f master $old_sha1 ;# restore previous state
        git rebase --continue ;# finish the rebase
        git merge incoming ;# pull in the pushed changes
  2. Are there other "we are implicitly assuming $ref won't change
     behind our backs" long-term commands?
-Peff
Previous: Junio C HamanoNext: Junio C Hamano
Message 41 of 91 in “[RFC - draft] List of proposed future changes that are backward incompatible”
  1. Junio C HamanoFeb 15, 2009
  2. Junio C HamanoFeb 15, 2009
  3. Jakub NarebskiFeb 15, 2009
  4. Junio C HamanoFeb 15, 2009
  5. Heikki OrsilaFeb 15, 2009
  6. disallowing push to currently checked-out branchJeff King, Feb 16, 2009
  7. david@lang.hmFeb 16, 2009
  8. david@lang.hmFeb 16, 2009
  9. Julian PhillipsFeb 16, 2009
  10. Jeff KingFeb 16, 2009
  11. Daniel BarkalowFeb 16, 2009
  12. Junio C HamanoFeb 16, 2009
  13. Sergio CallegariFeb 16, 2009
  14. Jeff KingFeb 16, 2009
  15. Sergio CallegariFeb 16, 2009
  16. Matthieu MoyFeb 16, 2009
  17. Johannes SchindelinFeb 16, 2009
  18. Jay SoffianFeb 16, 2009
  19. Johannes SchindelinFeb 16, 2009
  20. Jay SoffianFeb 16, 2009
  21. Johannes SchindelinFeb 16, 2009
  22. Jay SoffianFeb 16, 2009
  23. Jeff KingFeb 16, 2009
  24. Jay SoffianFeb 17, 2009
  25. PUSH_HEAD, was Re: disallowing push to currently checked-out branchJohannes Schindelin, Feb 17, 2009
  26. Jay SoffianFeb 17, 2009
  27. Jeff KingFeb 17, 2009
  28. Junio C HamanoFeb 17, 2009
  29. Jay SoffianFeb 17, 2009
  30. Johannes SchindelinFeb 17, 2009
  31. Sergio CallegariFeb 16, 2009
  32. Johannes SchindelinFeb 16, 2009
  33. Jay SoffianFeb 16, 2009
  34. Sergio CallegariFeb 17, 2009
  35. Johannes SchindelinFeb 17, 2009
  36. Sergio CallegariFeb 17, 2009
  37. Johannes SchindelinFeb 17, 2009
  38. Junio C HamanoFeb 17, 2009
  39. Junio C HamanoFeb 17, 2009
  40. Junio C HamanoFeb 16, 2009
  41. Jeff KingFeb 16, 2009
  42. Junio C HamanoFeb 16, 2009
  43. Jeff KingFeb 17, 2009
  44. Junio C HamanoFeb 17, 2009
  45. Jeff KingFeb 17, 2009
  46. Jeff KingFeb 16, 2009
  47. david@lang.hmFeb 16, 2009
  48. Jeff KingFeb 16, 2009
  49. david@lang.hmFeb 16, 2009
  50. Jeff KingFeb 16, 2009
  51. david@lang.hmFeb 16, 2009
  52. Jeff KingFeb 16, 2009
  53. Johannes SchindelinFeb 16, 2009
  54. dashed commands, was Re: disallowing push to currently checked-out branchJohannes Schindelin, Feb 16, 2009
  55. david@lang.hmFeb 15, 2009
  56. Johannes SchindelinFeb 15, 2009
  57. Junio C HamanoFeb 15, 2009
  58. david@lang.hmFeb 16, 2009
  59. Johannes SchindelinFeb 15, 2009
  60. david@lang.hmFeb 16, 2009
  61. Junio C HamanoFeb 16, 2009
  62. Johannes SchindelinFeb 16, 2009
  63. david@lang.hmFeb 16, 2009
  64. Sverre RabbelierFeb 16, 2009
  65. disallowing push to currently checked-out branchJeff King, Feb 16, 2009
  66. Sergio CallegariFeb 16, 2009
  67. Jakub NarebskiFeb 15, 2009
  68. Johannes SchindelinFeb 15, 2009
  69. Jakub NarebskiFeb 15, 2009
  70. david@lang.hmFeb 16, 2009
  71. send-email sending shallow threads by defaultJeff King, Feb 16, 2009
  72. Pieter de BieFeb 16, 2009
  73. Jeff KingFeb 16, 2009
  74. Brian GernhardtFeb 16, 2009
  75. Wincent ColaiutaFeb 16, 2009
  76. SZEDER GáborFeb 16, 2009
  77. Martin MaresFeb 16, 2009
  78. Andreas EricssonFeb 17, 2009
  79. Martin MaresFeb 17, 2009
  80. Jeff KingFeb 17, 2009
  81. Eric W. BiedermanFeb 20, 2009
  82. Jeff KingFeb 20, 2009
  83. Eric W. BiedermanFeb 20, 2009
  84. Andreas EricssonFeb 17, 2009
  85. Sitaram ChamartyFeb 16, 2009
  86. Björn SteinbrinkFeb 16, 2009
  87. Junio C HamanoFeb 16, 2009
  88. Björn SteinbrinkFeb 16, 2009
  89. [RFC - draft #2] List of proposed future changes that are backward incompatibleJunio C Hamano, Feb 16, 2009
  90. Jeff KingFeb 16, 2009
  91. Jakub NarebskiFeb 16, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.