Thread (20 messages) flat view 20 messages, 2 authors, 2017-12-27

Re: [PATCH 5/5] submodule: submodule_move_head omits old argument in forced case

From: Stefan Beller <hidden>
Date: 2017-12-20 19:36:27

On Tue, Dec 19, 2017 at 4:01 PM, Jonathan Nieder [off-list ref] wrote:
Stefan Beller wrote:
quoted
On Tue, Dec 19, 2017 at 2:44 PM, Jonathan Nieder [off-list ref] wrote:
quoted
quoted
  checkout -f
        I think I would expect this not to touch a submodule that
        hasn't changed, since that would be consistent with its
        behavior on files that haven't changed.
[...]
quoted
I may have a different understanding of git commands than you do,
but a plain "checkout -f" with no further arguments is the same as
a hard reset IMHO, and could be used interchangeably?
A kind person pointed out privately that you were talking about
"git checkout -f" with no further arguments, not "git checkout -f
<commit>".  In that context, the competing meanings I mentioned in
https://crbug.com/git/5 don't exist: either a given entry in the
worktree matches the index or it doesn't.

So plain "git checkout -f" is similar to plain "git reset --hard"
in that it means "make the worktree (and index, in the reset case)
look just like this".
with "this" == the argument that was given, if the argument
was omitted, HEAD is assumed.
 checkout -f makes the worktree look like the index;
No, here is what my installation of git (recent master) does:

  $ git --version
git version 2.15.1.389.g52015aaf9d

  $ cat test.sh

  rm -rf tmp
  git init tmp

  cd tmp
  git commit --allow-empty -m initial
  echo commit >a
  echo commit >b
  echo commit >c
  git add .
  git commit -m commit

  echo index >a
  git add a
  echo worktree >a

  echo index >b
  git add b

  echo worktree>c

  $ sh test.sh
Initialized empty Git repository in /u/tmp/.git/
[master (root-commit) c109fb5] initial
[master fcc21ea] commit
 3 files changed, 3 insertions(+)
 create mode 100644 a
 create mode 100644 b
 create mode 100644 c
  $ cd tmp
  $ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

modified:   a
modified:   b

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:   a
modified:   c

  $ git checkout -f
  $ git status
On branch master
nothing to commit, working tree clean

# Let's test the other commands as well:
  $ cd ..
  $ sh test.sh
   ...
  $ cd tmp
  $ git checkout -f HEAD
  $ git status
On branch master
nothing to commit, working tree clean

  # See, there is no difference between giving HEAD as an argument
  # or not! Try again with reset just for completeness:

  $ cd ..
  $ sh test.sh
   ...
  $ cd tmp
  $ git reset --hard
HEAD is now at b71ae70 commit
  $ git status
On branch master
nothing to commit, working tree clean

  # The only difference between reset and the checkout is that reset
  # tells me where we are.
reset --hard makes the worktree and index look like HEAD.
I agree.
In that context, more aggressively making the submodule in the
worktree get into the defined state sounds to me like a good change.

Hopefully my confusion helps illustrate what a commit message focusing
on the end user experience might want to mention.
I'll try to come up with a better commit message. Thanks for bearing
with me here.

Stefan

Thanks again,
Jonathan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help