Hi, I am not sure how to proceed with this. It seems like there are many arguments against it, and few for it. So in order to get a better idea where we stand, I have summarized the arguments so far below. I do not know which solution would make everyone happy. But I think there are a few advantages to be considered, and the remaining issues are not insurmountable. Clemens --- Pros and cons for "undeleting branches": + safety net It should not be easy to lose information with git. In most cases branches can be restored from the HEAD reflog, but it can be complicated if the branch has never been checked out. Even the trivial case is not as obvious as searching for a "Branch deleted" entry in the reflog. + less dependant on git branch -d Since git branch -d deletes branches which have been merged to a remote tracking branch, it does no longer guarantee that the branch is still available in history locally, and if the branch is also deleted remotely, running git remote prune removes it entirely. In that sense, it cannot be considered safe any more. Being able to restore deleted branches would make this a non-issue. + automatically prune remote tracking branches Once it is easy to restore deleted branches, there is no need to keep around remote tracking branches which have been deleted on the remote. They can be pruned automatically on git fetch. - only a convenience Considering the many potential issues for this corner case, why bother implementing it? Deleted branches can be restored from the HEAD reflog anyways. - implementation complexity Due to the possibility of D/F conflicts, "deleted reflogs" have to be renamed internally. This makes the reflog implementation more complex. - user interface complexity How to prune deleted branches? Currently, it is enough to do "git branch -D branch; git gc --prune" in order to get rid of the branch objects, at least if the HEAD reflog does not contain it or has expired. Consider for example adding a remote, and removing it again. This operation would leave a bunch of deleted branches, which potentially occupy a lot of disk space. How to find and restore deleted branches? If the reflog is used to record deleted branches, and a new branch of the same name is created, the reflog contains entries from unrelated branches. [1] If the deleted reflogs are stored in an attic, how do we reference those? [1] Also, what happens if that new branch is renamed?
Attachment:
signature.asc
Description: Digital signature