diff --git a/pkg/commands/git_commands/patch.go b/pkg/commands/git_commands/patch.go index f40f7fa6f1c..1cdd55f6390 100644 --- a/pkg/commands/git_commands/patch.go +++ b/pkg/commands/git_commands/patch.go @@ -88,8 +88,8 @@ func (self *PatchCommands) SaveTemporaryPatch(patch string) (string, error) { } // DeletePatchesFromCommit applies a patch in reverse for a commit -func (self *PatchCommands) DeletePatchesFromCommit(commits []*models.Commit, commitIndex int) error { - if err := self.rebase.BeginInteractiveRebaseForCommit(commits, commitIndex, false); err != nil { +func (self *PatchCommands) DeletePatchesFromCommit(commits []*models.Commit, commitIndex int, parentIdx int) error { + if err := self.rebase.BeginInteractiveRebaseForCommit(commits, commitIndex, parentIdx, false); err != nil { return err } @@ -113,12 +113,12 @@ func (self *PatchCommands) DeletePatchesFromCommit(commits []*models.Commit, com return self.rebase.ContinueRebase() } -func (self *PatchCommands) MovePatchToSelectedCommit(commits []*models.Commit, sourceCommitIdx int, destinationCommitIdx int) error { +func (self *PatchCommands) MovePatchToSelectedCommit(commits []*models.Commit, sourceCommitIdx int, destinationCommitIdx int, parentIdx int) error { if sourceCommitIdx < destinationCommitIdx { // Passing true for keepCommitsThatBecomeEmpty: if the moved-from // commit becomes empty, we want to keep it, mainly for consistency with // moving the patch to a *later* commit, which behaves the same. - if err := self.rebase.BeginInteractiveRebaseForCommit(commits, destinationCommitIdx, true); err != nil { + if err := self.rebase.BeginInteractiveRebaseForCommit(commits, destinationCommitIdx, parentIdx, true); err != nil { return err } @@ -217,14 +217,14 @@ func (self *PatchCommands) MovePatchToSelectedCommit(commits []*models.Commit, s return self.rebase.ContinueRebase() } -func (self *PatchCommands) MovePatchIntoIndex(commits []*models.Commit, commitIdx int, stash bool) error { +func (self *PatchCommands) MovePatchIntoIndex(commits []*models.Commit, commitIdx int, parentIdx int, stash bool) error { if stash { if err := self.stash.Push(fmt.Sprintf(self.Tr.AutoStashForMovingPatchToIndex, commits[commitIdx].ShortHash())); err != nil { return err } } - if err := self.rebase.BeginInteractiveRebaseForCommit(commits, commitIdx, false); err != nil { + if err := self.rebase.BeginInteractiveRebaseForCommit(commits, commitIdx, parentIdx, false); err != nil { return err } @@ -275,10 +275,11 @@ func (self *PatchCommands) MovePatchIntoIndex(commits []*models.Commit, commitId func (self *PatchCommands) PullPatchIntoNewCommit( commits []*models.Commit, commitIdx int, + parentIdx int, commitSummary string, commitDescription string, ) error { - if err := self.rebase.BeginInteractiveRebaseForCommit(commits, commitIdx, false); err != nil { + if err := self.rebase.BeginInteractiveRebaseForCommit(commits, commitIdx, parentIdx, false); err != nil { return err } @@ -318,10 +319,11 @@ func (self *PatchCommands) PullPatchIntoNewCommit( func (self *PatchCommands) PullPatchIntoNewCommitBefore( commits []*models.Commit, commitIdx int, + parentIdx int, commitSummary string, commitDescription string, ) error { - if err := self.rebase.BeginInteractiveRebaseForCommit(commits, commitIdx+1, true); err != nil { + if err := self.rebase.BeginInteractiveRebaseForCommit(commits, commitIdx+1, parentIdx, true); err != nil { return err } diff --git a/pkg/commands/git_commands/rebase.go b/pkg/commands/git_commands/rebase.go index 97d48a1a01f..ee97b3a8413 100644 --- a/pkg/commands/git_commands/rebase.go +++ b/pkg/commands/git_commands/rebase.go @@ -34,14 +34,14 @@ func NewRebaseCommands( } } -func (self *RebaseCommands) RewordCommit(commits []*models.Commit, index int, summary string, description string) error { +func (self *RebaseCommands) RewordCommit(commits []*models.Commit, index int, parentIdx int, summary string, description string) error { // This check is currently unreachable (handled in LocalCommitsController.reword), // but kept as a safeguard in case this method is used elsewhere. if self.config.NeedsGpgSubprocessForCommit() { return errors.New(self.Tr.DisabledForGPG) } - err := self.BeginInteractiveRebaseForCommit(commits, index, false) + err := self.BeginInteractiveRebaseForCommit(commits, index, parentIdx, false) if err != nil { return err } @@ -55,7 +55,7 @@ func (self *RebaseCommands) RewordCommit(commits []*models.Commit, index int, su return self.ContinueRebase() } -func (self *RebaseCommands) RewordCommitInEditor(commits []*models.Commit, index int) (*oscommands.CmdObj, error) { +func (self *RebaseCommands) RewordCommitInEditor(commits []*models.Commit, index int, parentIdx int) (*oscommands.CmdObj, error) { changes := []daemon.ChangeTodoAction{{ Hash: commits[index].Hash(), NewAction: todo.Reword, @@ -63,36 +63,36 @@ func (self *RebaseCommands) RewordCommitInEditor(commits []*models.Commit, index self.os.LogCommand(logTodoChanges(changes), false) return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{ - baseHashOrRoot: getBaseHashOrRoot(commits, index+1), + baseHashOrRoot: getBaseHashOrRoot(commits, parentIdx), instruction: daemon.NewChangeTodoActionsInstruction(changes), }), nil } -func (self *RebaseCommands) ResetCommitAuthor(commits []*models.Commit, start, end int) error { - return self.GenericAmend(commits, start, end, func(_ *models.Commit) error { +func (self *RebaseCommands) ResetCommitAuthor(commits []*models.Commit, start, end int, parentIdx int) error { + return self.GenericAmend(commits, start, end, parentIdx, func(_ *models.Commit) error { return self.commit.ResetAuthor() }) } -func (self *RebaseCommands) SetCommitAuthor(commits []*models.Commit, start, end int, value string) error { - return self.GenericAmend(commits, start, end, func(_ *models.Commit) error { +func (self *RebaseCommands) SetCommitAuthor(commits []*models.Commit, start, end int, parentIdx int, value string) error { + return self.GenericAmend(commits, start, end, parentIdx, func(_ *models.Commit) error { return self.commit.SetAuthor(value) }) } -func (self *RebaseCommands) AddCommitCoAuthor(commits []*models.Commit, start, end int, value string) error { - return self.GenericAmend(commits, start, end, func(commit *models.Commit) error { +func (self *RebaseCommands) AddCommitCoAuthor(commits []*models.Commit, start, end int, parentIdx int, value string) error { + return self.GenericAmend(commits, start, end, parentIdx, func(commit *models.Commit) error { return self.commit.AddCoAuthor(commit.Hash(), value) }) } -func (self *RebaseCommands) GenericAmend(commits []*models.Commit, start, end int, f func(commit *models.Commit) error) error { +func (self *RebaseCommands) GenericAmend(commits []*models.Commit, start, end int, parentIdx int, f func(commit *models.Commit) error) error { if start == end && models.IsHeadCommit(commits, start) { // we've selected the top commit so no rebase is required return f(commits[start]) } - err := self.BeginInteractiveRebaseForCommitRange(commits, start, end, false) + err := self.BeginInteractiveRebaseForCommitRange(commits, start, end, parentIdx, false) if err != nil { return err } @@ -139,13 +139,8 @@ func (self *RebaseCommands) MoveCommitsUp(commits []*models.Commit, startIdx int }).Run() } -func (self *RebaseCommands) InteractiveRebase(commits []*models.Commit, startIdx int, endIdx int, action todo.TodoCommand, flag string) error { - baseIndex := endIdx + 1 - if action == todo.Squash || action == todo.Fixup { - baseIndex++ - } - - baseHashOrRoot := getBaseHashOrRoot(commits, baseIndex) +func (self *RebaseCommands) InteractiveRebase(commits []*models.Commit, startIdx int, endIdx int, parentIdx int, action todo.TodoCommand, flag string) error { + baseHashOrRoot := getBaseHashOrRoot(commits, parentIdx) changes := lo.FilterMap(commits[startIdx:endIdx+1], func(commit *models.Commit, _ int) (daemon.ChangeTodoAction, bool) { return daemon.ChangeTodoAction{ @@ -295,7 +290,7 @@ func (self *RebaseCommands) getHashOfLastCommitMade() (string, error) { } // AmendTo amends the given commit with whatever files are staged -func (self *RebaseCommands) AmendTo(commits []*models.Commit, commitIndex int) error { +func (self *RebaseCommands) AmendTo(commits []*models.Commit, commitIndex int, parentIdx int) error { commit := commits[commitIndex] if err := self.commit.CreateFixupCommit(commit.Hash()); err != nil { @@ -308,7 +303,7 @@ func (self *RebaseCommands) AmendTo(commits []*models.Commit, commitIndex int) e } return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{ - baseHashOrRoot: getBaseHashOrRoot(commits, commitIndex+1), + baseHashOrRoot: getBaseHashOrRoot(commits, parentIdx), overrideEditor: true, instruction: daemon.NewMoveFixupCommitDownInstruction(commit.Hash(), fixupHash, true), }).Run() @@ -403,7 +398,7 @@ func (self *RebaseCommands) SquashAllAboveFixupCommits(commit *models.Commit) er // BeginInteractiveRebaseForCommit starts an interactive rebase to edit the current // commit and pick all others. After this you'll want to call `self.ContinueRebase() func (self *RebaseCommands) BeginInteractiveRebaseForCommit( - commits []*models.Commit, commitIndex int, keepCommitsThatBecomeEmpty bool, + commits []*models.Commit, commitIndex int, parentIdx int, keepCommitsThatBecomeEmpty bool, ) error { if commitIndex < len(commits) && commits[commitIndex].IsMerge() { if self.config.NeedsGpgSubprocessForCommit() { @@ -417,11 +412,11 @@ func (self *RebaseCommands) BeginInteractiveRebaseForCommit( }).Run() } - return self.BeginInteractiveRebaseForCommitRange(commits, commitIndex, commitIndex, keepCommitsThatBecomeEmpty) + return self.BeginInteractiveRebaseForCommitRange(commits, commitIndex, commitIndex, parentIdx, keepCommitsThatBecomeEmpty) } func (self *RebaseCommands) BeginInteractiveRebaseForCommitRange( - commits []*models.Commit, start, end int, keepCommitsThatBecomeEmpty bool, + commits []*models.Commit, start, end int, parentIdx int, keepCommitsThatBecomeEmpty bool, ) error { if len(commits)-1 < end { return errors.New("index outside of range of commits") @@ -444,7 +439,7 @@ func (self *RebaseCommands) BeginInteractiveRebaseForCommitRange( self.os.LogCommand(logTodoChanges(changes), false) return self.PrepareInteractiveRebaseCommand(PrepareInteractiveRebaseCommandOpts{ - baseHashOrRoot: getBaseHashOrRoot(commits, end+1), + baseHashOrRoot: getBaseHashOrRoot(commits, parentIdx), overrideEditor: true, keepCommitsThatBecomeEmpty: keepCommitsThatBecomeEmpty, instruction: daemon.NewChangeTodoActionsInstruction(changes), @@ -517,8 +512,8 @@ func (self *RebaseCommands) runSkipEditorCommand(cmdObj *oscommands.CmdObj) erro } // DiscardOldFileChanges discards changes to a file from an old commit -func (self *RebaseCommands) DiscardOldFileChanges(commits []*models.Commit, commitIndex int, filePaths []string) error { - if err := self.BeginInteractiveRebaseForCommit(commits, commitIndex, false); err != nil { +func (self *RebaseCommands) DiscardOldFileChanges(commits []*models.Commit, commitIndex int, parentIdx int, filePaths []string) error { + if err := self.BeginInteractiveRebaseForCommit(commits, commitIndex, parentIdx, false); err != nil { return err } diff --git a/pkg/commands/git_commands/rebase_test.go b/pkg/commands/git_commands/rebase_test.go index 46f1fcc1cc1..b6e42d215ff 100644 --- a/pkg/commands/git_commands/rebase_test.go +++ b/pkg/commands/git_commands/rebase_test.go @@ -100,6 +100,7 @@ func TestRebaseDiscardOldFileChanges(t *testing.T) { gitConfigMockResponses map[string]string commitOpts []models.NewCommitOpts commitIndex int + parentIndex int fileName []string runner *oscommands.FakeCmdObjRunner test func(error) @@ -111,6 +112,7 @@ func TestRebaseDiscardOldFileChanges(t *testing.T) { gitConfigMockResponses: nil, commitOpts: []models.NewCommitOpts{}, commitIndex: 0, + parentIndex: 0, fileName: []string{"test999.txt"}, runner: oscommands.NewFakeRunner(t), test: func(err error) { @@ -122,6 +124,7 @@ func TestRebaseDiscardOldFileChanges(t *testing.T) { gitConfigMockResponses: map[string]string{"commit.gpgSign": "true"}, commitOpts: []models.NewCommitOpts{{Name: "commit", Hash: "123456"}}, commitIndex: 0, + parentIndex: 0, fileName: []string{"test999.txt"}, runner: oscommands.NewFakeRunner(t), test: func(err error) { @@ -136,6 +139,7 @@ func TestRebaseDiscardOldFileChanges(t *testing.T) { {Name: "commit2", Hash: "abcdef"}, }, commitIndex: 0, + parentIndex: 1, fileName: []string{"test999.txt"}, runner: oscommands.NewFakeRunner(t). ExpectGitArgs([]string{"rebase", "--interactive", "--autostash", "--keep-empty", "--no-autosquash", "--rebase-merges", "abcdef"}, "", nil). @@ -163,7 +167,7 @@ func TestRebaseDiscardOldFileChanges(t *testing.T) { commits := lo.Map(s.commitOpts, func(opts models.NewCommitOpts, _ int) *models.Commit { return models.NewCommit(hashPool, opts) }) - s.test(instance.DiscardOldFileChanges(commits, s.commitIndex, s.fileName)) + s.test(instance.DiscardOldFileChanges(commits, s.commitIndex, s.parentIndex, s.fileName)) s.runner.CheckForMissingCalls() }) } diff --git a/pkg/gui/controllers/commits_files_controller.go b/pkg/gui/controllers/commits_files_controller.go index eed9d02b91c..99f73037152 100644 --- a/pkg/gui/controllers/commits_files_controller.go +++ b/pkg/gui/controllers/commits_files_controller.go @@ -353,7 +353,10 @@ func (self *CommitFilesController) discard(selectedNodes []*filetree.CommitFileN }) } - err := self.c.Git().Rebase.DiscardOldFileChanges(self.c.Model().Commits, self.c.Contexts().LocalCommits.GetSelectedLineIdx(), filePaths) + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) + + err := self.c.Git().Rebase.DiscardOldFileChanges(self.c.Model().Commits, self.c.Contexts().LocalCommits.GetSelectedLineIdx(), parentIdx, filePaths) if err := self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err); err != nil { return err } diff --git a/pkg/gui/controllers/custom_patch_options_menu_action.go b/pkg/gui/controllers/custom_patch_options_menu_action.go index cabba473959..14a966b2a56 100644 --- a/pkg/gui/controllers/custom_patch_options_menu_action.go +++ b/pkg/gui/controllers/custom_patch_options_menu_action.go @@ -134,8 +134,10 @@ func (self *CustomPatchOptionsMenuAction) handleDeletePatchFromCommit() error { return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error { commitIndex := self.getPatchCommitIndex() + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) self.c.LogAction(self.c.Tr.Actions.RemovePatchFromCommit) - err := self.c.Git().Patch.DeletePatchesFromCommit(self.c.Model().Commits, commitIndex) + err := self.c.Git().Patch.DeletePatchesFromCommit(self.c.Model().Commits, commitIndex, parentIdx) return self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err) }) } @@ -145,8 +147,10 @@ func (self *CustomPatchOptionsMenuAction) handleMovePatchToSelectedCommit() erro return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error { commitIndex := self.getPatchCommitIndex() + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) self.c.LogAction(self.c.Tr.Actions.MovePatchToSelectedCommit) - err := self.c.Git().Patch.MovePatchToSelectedCommit(self.c.Model().Commits, commitIndex, self.c.Contexts().LocalCommits.GetSelectedLineIdx()) + err := self.c.Git().Patch.MovePatchToSelectedCommit(self.c.Model().Commits, commitIndex, self.c.Contexts().LocalCommits.GetSelectedLineIdx(), parentIdx) return self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err) }) } @@ -161,8 +165,10 @@ func (self *CustomPatchOptionsMenuAction) handleMovePatchIntoWorkingTree() error HandleConfirm: func() error { return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error { commitIndex := self.getPatchCommitIndex() + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) self.c.LogAction(self.c.Tr.Actions.MovePatchIntoIndex) - err := self.c.Git().Patch.MovePatchIntoIndex(self.c.Model().Commits, commitIndex, mustStash) + err := self.c.Git().Patch.MovePatchIntoIndex(self.c.Model().Commits, commitIndex, parentIdx, mustStash) return self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err) }) }, @@ -173,6 +179,8 @@ func (self *CustomPatchOptionsMenuAction) handlePullPatchIntoNewCommit() error { self.returnFocusFromPatchExplorerIfNecessary() commitIndex := self.getPatchCommitIndex() + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) self.c.Helpers().Commits.OpenCommitMessagePanel( &helpers.OpenCommitMessagePanelOpts{ // Pass a commit index of one less than the moved-from commit, so that @@ -186,7 +194,7 @@ func (self *CustomPatchOptionsMenuAction) handlePullPatchIntoNewCommit() error { return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error { self.c.Helpers().Commits.CloseCommitMessagePanel() self.c.LogAction(self.c.Tr.Actions.MovePatchIntoNewCommit) - err := self.c.Git().Patch.PullPatchIntoNewCommit(self.c.Model().Commits, commitIndex, summary, description) + err := self.c.Git().Patch.PullPatchIntoNewCommit(self.c.Model().Commits, commitIndex, parentIdx, summary, description) if err := self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err); err != nil { return err } @@ -204,6 +212,8 @@ func (self *CustomPatchOptionsMenuAction) handlePullPatchIntoNewCommitBefore() e self.returnFocusFromPatchExplorerIfNecessary() commitIndex := self.getPatchCommitIndex() + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 2) self.c.Helpers().Commits.OpenCommitMessagePanel( &helpers.OpenCommitMessagePanelOpts{ // Pass a commit index of one less than the moved-from commit, so that @@ -217,7 +227,7 @@ func (self *CustomPatchOptionsMenuAction) handlePullPatchIntoNewCommitBefore() e return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(gocui.Task) error { self.c.Helpers().Commits.CloseCommitMessagePanel() self.c.LogAction(self.c.Tr.Actions.MovePatchIntoNewCommit) - err := self.c.Git().Patch.PullPatchIntoNewCommitBefore(self.c.Model().Commits, commitIndex, summary, description) + err := self.c.Git().Patch.PullPatchIntoNewCommitBefore(self.c.Model().Commits, commitIndex, parentIdx, summary, description) if err := self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err); err != nil { return err } diff --git a/pkg/gui/controllers/helpers/commits_helper.go b/pkg/gui/controllers/helpers/commits_helper.go index 5e50ba7b26d..3f1a6751160 100644 --- a/pkg/gui/controllers/helpers/commits_helper.go +++ b/pkg/gui/controllers/helpers/commits_helper.go @@ -7,6 +7,7 @@ import ( "time" "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/gocui" "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/samber/lo" @@ -252,6 +253,39 @@ func (self *CommitsHelper) OpenCommitMenu(suggestionFunc func(string) []*types.S }) } +func (self *CommitsHelper) GetParentCommit(selectedCommits []*models.Commit, endIdx int, depth int) (*models.Commit, int) { + commits := self.c.Model().Commits + + currentCommit := selectedCommits[len(selectedCommits)-1] + parentIndex := endIdx + var parentCommit *models.Commit + + for d := 0; d < depth; d++ { + selectedParents := currentCommit.Parents() + if len(selectedParents) == 0 { + self.c.Log.Warn("Selected commit has no parents, the nearest commit is used") + return commits[parentIndex], parentIndex + 1 + } + parentHash := selectedParents[0] + found := false + for i, commit := range commits { + if commit.Hash() == parentHash { + parentIndex = i + parentCommit = commits[parentIndex] + currentCommit = parentCommit + found = true + break + } + } + if !found { + self.c.Log.Warnf("Parent commit %s not found in visible commit list, the nearest commit is used ", parentHash) + return commits[parentIndex], parentIndex + 1 + } + } + + return parentCommit, parentIndex +} + func (self *CommitsHelper) addCoAuthor(suggestionFunc func(string) []*types.Suggestion) error { self.c.Prompt(types.PromptOpts{ Title: self.c.Tr.AddCoAuthorPromptTitle, diff --git a/pkg/gui/controllers/local_commits_controller.go b/pkg/gui/controllers/local_commits_controller.go index 4ab436bbc25..289b326c3ad 100644 --- a/pkg/gui/controllers/local_commits_controller.go +++ b/pkg/gui/controllers/local_commits_controller.go @@ -337,13 +337,15 @@ func (self *LocalCommitsController) squashDown(selectedCommits []*models.Commit, return self.updateTodos(todo.Squash, selectedCommits) } + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) + self.c.Confirm(types.ConfirmOpts{ Title: self.c.Tr.Squash, Prompt: self.c.Tr.SureSquashThisCommit, HandleConfirm: func() error { return self.c.WithWaitingStatus(self.c.Tr.SquashingStatus, func(gocui.Task) error { self.c.LogAction(self.c.Tr.Actions.SquashCommitDown) - return self.interactiveRebase(todo.Squash, startIdx, endIdx) + return self.interactiveRebase(todo.Squash, startIdx, endIdx, parentIdx) }) }, }) @@ -355,6 +357,7 @@ func (self *LocalCommitsController) fixup(selectedCommits []*models.Commit, star if self.isRebasing() { return self.updateTodos(todo.Fixup, selectedCommits) } + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) return self.c.Menu(types.CreateMenuOptions{ Title: self.c.Tr.Fixup, @@ -365,7 +368,7 @@ func (self *LocalCommitsController) fixup(selectedCommits []*models.Commit, star OnPress: func() error { return self.c.WithWaitingStatus(self.c.Tr.FixingStatus, func(gocui.Task) error { self.c.LogAction(self.c.Tr.Actions.FixupCommit) - return self.interactiveRebase(todo.Fixup, startIdx, endIdx) + return self.interactiveRebase(todo.Fixup, startIdx, endIdx, parentIdx) }) }, Tooltip: self.c.Tr.FixupTooltip, @@ -376,7 +379,7 @@ func (self *LocalCommitsController) fixup(selectedCommits []*models.Commit, star OnPress: func() error { return self.c.WithWaitingStatus(self.c.Tr.FixingStatus, func(gocui.Task) error { self.c.LogAction(self.c.Tr.Actions.FixupCommitKeepMessage) - return self.interactiveRebaseWithFlag(todo.Fixup, startIdx, endIdx, "-C") + return self.interactiveRebaseWithFlag(todo.Fixup, startIdx, endIdx, parentIdx, "-C") }) }, Tooltip: self.c.Tr.FixupKeepMessageTooltip, @@ -454,7 +457,10 @@ func (self *LocalCommitsController) switchFromCommitMessagePanelToEditor(filepat self.c.Git().Commit.RewordLastCommitInEditorWithMessageFileCmdObj(filepath)) } - err := self.c.Git().Rebase.BeginInteractiveRebaseForCommit(self.c.Model().Commits, self.context().GetSelectedLineIdx(), false) + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) + + err := self.c.Git().Rebase.BeginInteractiveRebaseForCommit(self.c.Model().Commits, self.context().GetSelectedLineIdx(), parentIdx, false) if err != nil { return err } @@ -483,8 +489,11 @@ func (self *LocalCommitsController) handleReword(summary string, description str self.c.Tr.RewordingStatus, nil, nil) } + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) + return self.c.WithWaitingStatus(self.c.Tr.RewordingStatus, func(gocui.Task) error { - err := self.c.Git().Rebase.RewordCommit(self.c.Model().Commits, self.c.Contexts().LocalCommits.GetSelectedLineIdx(), summary, description) + err := self.c.Git().Rebase.RewordCommit(self.c.Model().Commits, self.c.Contexts().LocalCommits.GetSelectedLineIdx(), parentIdx, summary, description) if err != nil { return err } @@ -500,8 +509,11 @@ func (self *LocalCommitsController) doRewordEditor() error { return self.c.RunSubprocessAndRefresh(self.c.Git().Commit.RewordLastCommitInEditorCmdObj()) } + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) + subProcess, err := self.c.Git().Rebase.RewordCommitInEditor( - self.c.Model().Commits, self.context().GetSelectedLineIdx(), + self.c.Model().Commits, self.context().GetSelectedLineIdx(), parentIdx, ) if err != nil { return err @@ -561,6 +573,8 @@ func (self *LocalCommitsController) drop(selectedCommits []*models.Commit, start isMerge := selectedCommits[0].IsMerge() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) + self.c.Confirm(types.ConfirmOpts{ Title: self.c.Tr.DropCommitTitle, Prompt: lo.Ternary(isMerge, self.c.Tr.DropMergeCommitPrompt, self.c.Tr.DropCommitPrompt), @@ -570,7 +584,7 @@ func (self *LocalCommitsController) drop(selectedCommits []*models.Commit, start if isMerge { return self.dropMergeCommit(startIdx) } - return self.interactiveRebase(todo.Drop, startIdx, endIdx) + return self.interactiveRebase(todo.Drop, startIdx, endIdx, parentIdx) }) }, }) @@ -588,10 +602,12 @@ func (self *LocalCommitsController) edit(selectedCommits []*models.Commit, start return self.updateTodos(todo.Edit, selectedCommits) } + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) + commits := self.c.Model().Commits if !commits[endIdx].IsMerge() { selectionRangeAndMode := self.getSelectionRangeAndMode() - err := self.c.Git().Rebase.InteractiveRebase(commits, startIdx, endIdx, todo.Edit, "") + err := self.c.Git().Rebase.InteractiveRebase(commits, startIdx, endIdx, parentIdx, todo.Edit, "") return self.c.Helpers().MergeAndRebase.CheckMergeOrRebaseWithRefreshOptions( err, types.RefreshOptions{ @@ -696,18 +712,18 @@ func (self *LocalCommitsController) pick(selectedCommits []*models.Commit) error panic("should be disabled when not rebasing") } -func (self *LocalCommitsController) interactiveRebase(action todo.TodoCommand, startIdx int, endIdx int) error { - return self.interactiveRebaseWithFlag(action, startIdx, endIdx, "") +func (self *LocalCommitsController) interactiveRebase(action todo.TodoCommand, startIdx int, endIdx int, parentIdx int) error { + return self.interactiveRebaseWithFlag(action, startIdx, endIdx, parentIdx, "") } -func (self *LocalCommitsController) interactiveRebaseWithFlag(action todo.TodoCommand, startIdx int, endIdx int, flag string) error { +func (self *LocalCommitsController) interactiveRebaseWithFlag(action todo.TodoCommand, startIdx int, endIdx int, parentIdx int, flag string) error { // When performing an action that will remove the selected commits, we need to select the // next commit down (which will end up at the start index after the action is performed) if action == todo.Drop || action == todo.Fixup || action == todo.Squash { self.context().SetSelection(startIdx) } - err := self.c.Git().Rebase.InteractiveRebase(self.c.Model().Commits, startIdx, endIdx, action, flag) + err := self.c.Git().Rebase.InteractiveRebase(self.c.Model().Commits, startIdx, endIdx, parentIdx, action, flag) return self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err) } @@ -813,6 +829,9 @@ func (self *LocalCommitsController) moveUp(selectedCommits []*models.Commit, sta func (self *LocalCommitsController) amendTo(commit *models.Commit) error { var handleCommit func() error + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) + if self.isSelectedHeadCommit() { handleCommit = func() error { return self.c.Helpers().WorkingTree.WithEnsureCommittableFiles(func() error { @@ -828,7 +847,7 @@ func (self *LocalCommitsController) amendTo(commit *models.Commit) error { return self.c.Helpers().WorkingTree.WithEnsureCommittableFiles(func() error { return self.c.WithWaitingStatus(self.c.Tr.AmendingStatus, func(gocui.Task) error { self.c.LogAction(self.c.Tr.Actions.AmendCommit) - err := self.c.Git().Rebase.AmendTo(self.c.Model().Commits, self.context().GetView().SelectedLineIdx()) + err := self.c.Git().Rebase.AmendTo(self.c.Model().Commits, self.context().GetView().SelectedLineIdx(), parentIdx) return self.c.Helpers().MergeAndRebase.CheckMergeOrRebase(err) }) }) @@ -857,25 +876,27 @@ func (self *LocalCommitsController) canAmend(_ *models.Commit) *types.DisabledRe } func (self *LocalCommitsController) amendAttribute(commits []*models.Commit, start, end int) error { + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) opts := self.c.KeybindingsOpts() return self.c.Menu(types.CreateMenuOptions{ Title: "Amend commit attribute", Items: []*types.MenuItem{ { Label: self.c.Tr.ResetAuthor, - OnPress: func() error { return self.resetAuthor(start, end) }, + OnPress: func() error { return self.resetAuthor(start, end, parentIdx) }, Keys: opts.GetKeys(opts.Config.AmendAttribute.ResetAuthor), Tooltip: self.c.Tr.ResetAuthorTooltip, }, { Label: self.c.Tr.SetAuthor, - OnPress: func() error { return self.setAuthor(start, end) }, + OnPress: func() error { return self.setAuthor(start, end, parentIdx) }, Keys: opts.GetKeys(opts.Config.AmendAttribute.SetAuthor), Tooltip: self.c.Tr.SetAuthorTooltip, }, { Label: self.c.Tr.AddCoAuthor, - OnPress: func() error { return self.addCoAuthor(start, end) }, + OnPress: func() error { return self.addCoAuthor(start, end, parentIdx) }, Keys: opts.GetKeys(opts.Config.AmendAttribute.AddCoAuthor), Tooltip: self.c.Tr.AddCoAuthorTooltip, }, @@ -883,10 +904,10 @@ func (self *LocalCommitsController) amendAttribute(commits []*models.Commit, sta }) } -func (self *LocalCommitsController) resetAuthor(start, end int) error { +func (self *LocalCommitsController) resetAuthor(start, end int, parentIdx int) error { return self.c.WithWaitingStatus(self.c.Tr.AmendingStatus, func(gocui.Task) error { self.c.LogAction(self.c.Tr.Actions.ResetCommitAuthor) - if err := self.c.Git().Rebase.ResetCommitAuthor(self.c.Model().Commits, start, end); err != nil { + if err := self.c.Git().Rebase.ResetCommitAuthor(self.c.Model().Commits, start, end, parentIdx); err != nil { return err } @@ -895,14 +916,14 @@ func (self *LocalCommitsController) resetAuthor(start, end int) error { }) } -func (self *LocalCommitsController) setAuthor(start, end int) error { +func (self *LocalCommitsController) setAuthor(start, end int, parentIdx int) error { self.c.Prompt(types.PromptOpts{ Title: self.c.Tr.SetAuthorPromptTitle, FindSuggestionsFunc: self.c.Helpers().Suggestions.GetAuthorsSuggestionsFunc(), HandleConfirm: func(value string) error { return self.c.WithWaitingStatus(self.c.Tr.AmendingStatus, func(gocui.Task) error { self.c.LogAction(self.c.Tr.Actions.SetCommitAuthor) - if err := self.c.Git().Rebase.SetCommitAuthor(self.c.Model().Commits, start, end, value); err != nil { + if err := self.c.Git().Rebase.SetCommitAuthor(self.c.Model().Commits, start, end, parentIdx, value); err != nil { return err } @@ -915,14 +936,14 @@ func (self *LocalCommitsController) setAuthor(start, end int) error { return nil } -func (self *LocalCommitsController) addCoAuthor(start, end int) error { +func (self *LocalCommitsController) addCoAuthor(start, end int, parentIdx int) error { self.c.Prompt(types.PromptOpts{ Title: self.c.Tr.AddCoAuthorPromptTitle, FindSuggestionsFunc: self.c.Helpers().Suggestions.GetAuthorsSuggestionsFunc(), HandleConfirm: func(value string) error { return self.c.WithWaitingStatus(self.c.Tr.AmendingStatus, func(gocui.Task) error { self.c.LogAction(self.c.Tr.Actions.AddCommitCoAuthor) - if err := self.c.Git().Rebase.AddCommitCoAuthor(self.c.Model().Commits, start, end, value); err != nil { + if err := self.c.Git().Rebase.AddCommitCoAuthor(self.c.Model().Commits, start, end, parentIdx, value); err != nil { return err } self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) diff --git a/pkg/gui/controllers/patch_building_controller.go b/pkg/gui/controllers/patch_building_controller.go index dd8c89fff00..d9b31734879 100644 --- a/pkg/gui/controllers/patch_building_controller.go +++ b/pkg/gui/controllers/patch_building_controller.go @@ -225,8 +225,10 @@ func (self *PatchBuildingController) discardSelectionFromCommit() error { return self.c.WithWaitingStatusSync(self.c.Tr.RebasingStatus, func() error { commitIndex := self.getPatchCommitIndex() + selectedCommits, _, endIdx := self.c.Contexts().LocalCommits.GetSelectedItems() + _, parentIdx := self.c.Helpers().Commits.GetParentCommit(selectedCommits, endIdx, 1) self.c.LogAction(self.c.Tr.Actions.RemovePatchFromCommit) - err := self.c.Git().Patch.DeletePatchesFromCommit(self.c.Model().Commits, commitIndex) + err := self.c.Git().Patch.DeletePatchesFromCommit(self.c.Model().Commits, commitIndex, parentIdx) self.c.Helpers().PatchBuilding.Escape() return self.c.Helpers().MergeAndRebase.CheckMergeOrRebaseWithRefreshOptions( err, types.RefreshOptions{Mode: types.SYNC}) diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index d112c037925..c3b1d667a29 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -1292,7 +1292,7 @@ func EnglishTranslationSet() *TranslationSet { SetFixupMessageTooltip: "Set the message option for the fixup commit. The -C option means to use this commit's message instead of the target commit's message.", FixupDiscardMessage: "Fixup and discard this commit's message", FixupDiscardMessageTooltip: "Squash the selected commit into the commit below, discarding this commit's message.", - SureSquashThisCommit: "Are you sure you want to squash the selected commit(s) into the commit below?", + SureSquashThisCommit: "Are you sure you want to squash the selected commit(s) into the parent commit below?", Squash: "Squash", PickCommitTooltip: "Mark the selected commit to be picked (when mid-rebase). This means that the commit will be retained upon continuing the rebase.", Pick: "Pick", diff --git a/pkg/i18n/translations/ko.json b/pkg/i18n/translations/ko.json index 1de57315e59..cff55d8183c 100644 --- a/pkg/i18n/translations/ko.json +++ b/pkg/i18n/translations/ko.json @@ -1,381 +1,381 @@ { - "NotEnoughSpace": "패널을 렌더링 할 공간이 부족합니다.", - "DiffTitle": "변경점", - "FilesTitle": "파일", - "BranchesTitle": "브랜치", - "CommitsTitle": "커밋", - "EasterEgg": "이스터 에그", - "UnstagedChanges": "Staged되지 않은 변경 내용", - "StagedChanges": "Staged된 변경 내용", - "StagingTitle": "메인 패널 (Staging)", - "MergingTitle": "메인 패널 (Merging)", - "NormalTitle": "메인 패널 (Normal)", - "LogTitle": "로그", - "CommitSummary": "커밋 메시지", - "CredentialsUsername": "사용자 이름", - "CredentialsPassword": "패스워드", - "CredentialsPassphrase": "SSH키의 passphrase 입력", - "CredentialsPIN": "SSH키\u001d의 PIN\u001d을 입력", - "CredentialsToken": "SSH 키를 위한 토큰 입력", - "PassUnameWrong": "패스워드, passphrase 또는 사용자 이름이 잘못되었습니다.", - "Commit": "커밋 변경내용", - "CommitTooltip": "스테이징된 변경 사항 커밋.", - "AmendLastCommit": "마지맛 커밋 수정", - "AmendLastCommitTitle": "마지막 커밋 수정", - "SureToAmend": "마지막 커밋을 수정하시겠습니까? 그런 다음 커밋 패널에서 커밋 메시지를 변경할 수 있습니다.", - "NoCommitToAmend": "Amend 가능한 커밋이 없습니다.", - "CommitChangesWithEditor": "Git 편집기를 사용하여 변경 내용을 커밋합니다.", - "NoBaseCommitsFound": "기본 커밋을 찾을 수 없습니다", - "MultipleBaseCommitsFoundStaged": "여러 개의 기본 커밋을 찾았습니다. (한 번에 더 적은 변경 사항을 스테이징해보세요)", - "MultipleBaseCommitsFoundUnstaged": "여러 개의 기본 커밋을 찾았습니다. (변경 사항 중 일부를 스테이징해보세요)", - "BaseCommitIsAlreadyOnMainBranch": "이 변경 사항의 기본 커밋은 이미 메인 브랜치에 있습니다", - "StatusTitle": "상태", - "GlobalTitle": "글로벌 키 바인딩", - "Execute": "실행", - "Stage": "Staged 전환", - "ToggleStagedAll": "모든 변경을 Staged/unstaged으로 전환", - "ToggleTreeView": "파일 트리뷰로 전환", - "OpenMergeTool": "Git mergetool를 열기", - "Refresh": "새로고침", - "Push": "푸시", - "Pull": "업데이트", - "FileFilter": "파일을 필터하기 (Staged/unstaged)", - "CopyToClipboardMenu": "클립보드에 복사", - "CopyFileName": "파일명", - "CopySelectedDiff": "선택한 파일의 변경점", - "CopyAllFilesDiff": "모든 파일의 변경점", - "NoContentToCopyError": "복사 대상이 없습니다", - "FileNameCopiedToast": "파일명을 클립보드에 복사했습니다.", - "FilePathCopiedToast": "파일경로를 클립보드에 복사했습니다.", - "FileDiffCopiedToast": "파일의 변경점을 클립보드에 복사했습니다.", - "AllFilesDiffCopiedToast": "모든 파일의 변경점을 클립보드에 복사했습니다.", - "FilterStagedFiles": "Staged된 파일만 표시", - "FilterUnstagedFiles": "Stage되지 않은 파일만 표시", - "MergeConflictsTitle": "병합 충돌", - "Checkout": "체크아웃", - "NoChangedFiles": "변경된 파일이 없습니다.", - "SoftReset": "소프트 리셋", - "AlreadyCheckedOutBranch": "브랜치가 이미 체크아웃 되었습니다", - "SureForceCheckout": "강제로 체크아웃하시겠습니까? 모든 로컬 변경 사항을 잃게 됩니다.", - "ForceCheckoutBranch": "브랜치 강제 체크아웃", - "BranchName": "브랜치 이름", - "NewBranchNameBranchOff": "새 브랜치 이름 (branch is off of '{{.branchName}}')", - "CantDeleteCheckOutBranch": "체크아웃하는 브랜치는 삭제할 수 없습니다!", - "DeleteBranchTitle": "'{{.selectedBranchName}}' 브랜치를 삭제하시겠습니까?", - "DeleteLocalBranch": "로컬 브랜치를 삭제", - "ForceDeleteBranchTitle": "브랜치를 강제 삭제", - "ForceDeleteBranchMessage": "'{{.selectedBranchName}}'는 완전히 병합되지 않았습니다. 정말 삭제하시겠습니까?", - "RebaseBranch": "체크아웃된 브랜치를 이 브랜치에 리베이스", - "CantRebaseOntoSelf": "브랜치를 자기 자신에게 리베이스할 수는 없습니다.", - "CantMergeBranchIntoItself": "브랜치를 자기 자신에게 병합할 수는 없습니다.", - "ForceCheckout": "강제 체크아웃", - "CheckoutByName": "이름으로 체크아웃", - "NewBranch": "새 브랜치 생성", - "NoBranchesThisRepo": "저장소에 브랜치가 존재하지 않습니다.", - "CommitWithoutMessageErr": "커밋 메시지를 입력하세요.", - "Close": "닫기", - "CloseCancel": "닫기/취소", - "Confirm": "확인", - "Quit": "종료", - "SureSquashThisCommit": "Are you sure you want to squash this commit into the commit below?", - "Squash": "스쿼시", - "PickCommitTooltip": "Pick commit (when mid-rebase)", - "Reword": "커밋메시지 변경", - "DropCommit": "커밋 삭제", - "MoveDownCommit": "커밋을 1개 아래로 이동", - "MoveUpCommit": "커밋을 1개 위로 이동", - "EditCommitTooltip": "커밋을 편집", - "AmendCommitTooltip": "Amend commit with staged changes", - "ResetAuthor": "Reset commit author", - "RewordCommitEditor": "에디터에서 커밋메시지 수정", - "NoCommitsThisBranch": "이 브랜치에 커밋이 없습니다.", - "Error": "오류", - "Undo": "되돌리기", - "UndoReflog": "되돌리기 (reflog) (실험적)", - "RedoReflog": "다시 실행 (reflog) (실험적)", - "Apply": "적용", - "NoStashEntries": "Stash가 존재하지 않습니다.", - "StashDrop": "Stash를 삭제", - "StashPop": "Stash를 pop", - "SurePopStashEntry": "정말로 Stash를 pop하시겠습니까?", - "StashApply": "Stash 적용", - "SureApplyStashEntry": "정말로 Stash를 적용하시겠습니까?", - "StashChanges": "변경을 Stash", - "OpenConfig": "설정 파일 열기", - "EditConfig": "설정 파일 수정", - "ForcePush": "강제 푸시", - "ForcePushPrompt": "브랜치가 원격 브랜치에서 분기하고 있습니다. 'esc'를 눌러 취소하거나, 'enter'를 눌러 강제로 푸시하세요.", - "ForcePushDisabled": "브랜치가 원격 브랜치에서 분기하고 있습니다. force push가 비활성화 되었습니다.", - "UpdatesRejectedAndForcePushDisabled": "업데이트가 거부되었으며 강제 푸시를 비활성화했습니다.", - "CheckForUpdate": "업데이트 확인", - "CheckingForUpdates": "업데이트 확인 중...", - "UpdateAvailableTitle": "새로운 업데이트 사용가능!", - "UpdateAvailable": "버전 {{.newVersion}} 을(를) 설치하시겠습니까?", - "UpdateInProgressWaitingStatus": "업데이트 중", - "UpdateCompletedTitle": "업데이트 완료!", - "UpdateCompleted": "업데이트 설치에 성공했습니다. lazygit를 재시작해주세요.", - "FailedToRetrieveLatestVersionErr": "버전 정보를 받아오는데 실패했습니다.", - "OnLatestVersionErr": "이미 최신 버전을 사용하고 있습니다.", - "MajorVersionErr": "새 버전 ({{.newVersion}}) 에 현재 버전({{.currentVersion}}) 과 비교할 때 호환되지 않는 변경 사항이 있습니다.", - "CouldNotFindBinaryErr": "{{.url}} 에서 바이너리를 찾을 수 없습니다.", - "UpdateFailedErr": "업데이트 실패: {{.errMessage}}", - "ConfirmQuitDuringUpdateTitle": "현재 업데이트 중입니다.", - "ConfirmQuitDuringUpdate": "현재 업데이트를 진행 중입니다.종료하시겠습니까?", - "GitconfigParseErr": "따옴표로 묶이지 않은 '\\' 문자가 있어서 Gogit이 gitconfig 파일을 분석하지 못했습니다. 이를 제거하면 문제가 해결됩니다.", - "EditFile": "파일 편집", - "OpenFile": "파일 닫기", - "IgnoreFile": ".gitignore에 추가", - "RefreshFiles": "파일 새로고침", - "Merge": "현재 브랜치에 병합", - "ConfirmQuit": "정말로 종료하시겠습니까?", - "SwitchRepo": "최근에 사용한 저장소로 전환", - "UnsupportedGitService": "지원되지 않는 Git 서비스입니다.", - "CopyPullRequestURL": "풀 리퀘스트 URL을 클립보드에 복사", - "NoBranchOnRemote": "브랜치가 원격에 없습니다. 원격에 먼저 푸시해야합니다.", - "FileEnter": "Stage individual hunks/lines for file, or collapse/expand for directory", - "StageSelectionTooltip": "선택한 행을 staged / unstaged", - "DiscardSelection": "변경을 삭제 (git reset)", - "ToggleSelectionForPatch": "Line(s)을 패치에 추가/삭제", - "ToggleStagingView": "패널 전환", - "ReturnToFilesPanel": "파일 목록으로 돌아가기", - "FastForward": "Fast-forward this branch from its upstream", - "FoundConflictsTitle": "Auto-merge failed", - "RecentRepos": "최근에 사용한 저장소", - "CommitSummaryTitle": "커밋메시지", - "LocalBranchesTitle": "브랜치", - "SearchTitle": "검색", - "TagsTitle": "태그", - "MenuTitle": "메뉴", - "RemotesTitle": "원격", - "RemoteBranchesTitle": "원격 브랜치", - "PatchBuildingTitle": "메인 패널 (Patch Building)", - "InformationTitle": "정보", - "ErrorOccurred": "오류가 발생했습니다! issue를 작성해 주세요: ", - "CherryPickCopy": "커밋을 복사 (cherry-pick)", - "PasteCommits": "커밋을 붙여넣기 (cherry-pick)", - "CherryPick": "체리픽", - "Donate": "후원", - "AskQuestion": "질문하기", - "PrevHunk": "이전 hunk를 선택", - "NextHunk": "다음 hunk를 선택", - "PrevConflict": "이전 충돌을 선택", - "NextConflict": "다음 충돌을 선택", - "SelectPrevHunk": "이전 hunk를 선택", - "SelectNextHunk": "다음 hunk를 선택", - "ScrollDown": "아래로 스크롤", - "ScrollUp": "위로 스크롤", - "ScrollUpMainWindow": "메인 패널을 위로 스크롤", - "ScrollDownMainWindow": "메인 패널을 아래로로 스크롤", - "DropCommitTitle": "커밋 삭제", - "DropCommitPrompt": "정말로 선택한 커밋을 삭제하시겠습니까?", - "PullingStatus": "업데이트 중", - "PushingStatus": "푸시 중", - "FetchingStatus": "패치 중", - "SubCommitsDynamicTitle": "커밋 (%s)", - "RemoteBranchesDynamicTitle": "원격브랜치 (%s)", - "ViewItemFiles": "View selected item's files", - "CommitFilesTitle": "커밋 파일", - "CheckoutCommitFileTooltip": "Checkout file", - "DiscardOldFileChangeTooltip": "Discard this commit's changes to this file", - "DiscardFileChangesTitle": "파일 변경 사항 버리기", - "Discard": "View 'discard changes' options", - "Cancel": "취소", - "DiscardAllChanges": "모든 변경사항 버리기", - "Delete": "삭제", - "Reset": "초기화", - "ViewResetOptions": "View reset options", - "CreateFixupCommitTooltip": "Create fixup commit for this commit", - "SquashAboveCommitsTooltip": "Squash all 'fixup!' commits above selected commit (autosquash)", - "PressEnterToReturn": "엔터를 눌러 lazygit으로 돌아갑니다.", - "ViewStashOptions": "Stash 옵션 보기", - "StashAllChanges": "변경사항을 Stash", - "StashOptions": "Stash 옵션", - "ScrollLeft": "우 스크롤", - "ScrollRight": "좌 스크롤", - "DiscardPatch": "Patch 버리기", - "ToggleAllInPatch": "Toggle all files included in patch", - "ViewPatchOptions": "커스텀 Patch 옵션 보기", - "PatchOptionsTitle": "Patch 옵션", - "EnterCommitFile": "Enter file to add selected lines to the patch (or toggle directory collapsed)", - "EnterUpstream": "' '와 같은 형식으로 입력하세요.", - "InvalidUpstream": "Upstream의 형식이 잘못되었습니다.' ' 와 같은 형식으로 입력하세요.", - "NewRemote": "새로운 Remote 추가", - "NewRemoteName": "새로운 Remote 이름:", - "NewRemoteUrl": "새로운 Remote URL:", - "EditRemoteName": "{{.remoteName}} 의 새로운 Remote 이름 입력:", - "EditRemoteUrl": "{{.remoteName}} 의 새로운 Remote URL 입력:", - "RemoveRemote": "Remote를 삭제", - "DeleteRemoteBranch": "원격 브랜치를 삭제", - "SetUpstream": "Set as upstream of checked-out branch", - "EditRemoteTooltip": "Remote를 수정", - "TagNameTitle": "태그 이름", - "TagMessageTitle": "태그 메시지", - "PushTagTitle": "원격에 태그 '{{.tagName}}' 를 푸시", - "PushTag": "태그를 push", - "NewTag": "태그를 생성", - "FetchRemoteTooltip": "원격을 업데이트", - "GitFlowOptions": "Git-flow 옵션 보기", - "NewBranchNamePrompt": "새로운 브랜치 이름 입력", - "NextScreenMode": "다음 스크린 모드 (normal/half/fullscreen)", - "PrevScreenMode": "이전 스크린 모드", - "StartSearch": "검색 시작", - "Keybindings": "키 바인딩", - "RenameBranch": "브랜치 이름 변경", - "OpenKeybindingsMenu": "매뉴 열기", - "ResetCherryPick": "Reset cherry-picked (copied) commits selection", - "NextTab": "이전 탭", - "PrevTab": "다음 탭", - "CantUndoWhileRebasing": "리베이스중에는 되돌릴 수 없습니다.", - "CantRedoWhileRebasing": "리베이스중에는 다시 실행할 수 없습니다.", - "ConfirmationTitle": "확인 패널", - "PrevPage": "이전 페이지", - "NextPage": "다음 페이지", - "GotoTop": "맨 위로 스크롤 ", - "GotoBottom": "맨 아래로 스크롤 ", - "ResetInParentheses": "(reset)", - "OpenFilteringMenu": "View filter-by-path options", - "ExitFilterMode": "Stop filtering by path", - "MustExitFilterModePrompt": "Command not available in filtered mode. Exit filtered mode?", - "EnterRefName": "Ref 입력:", - "ExitDiffMode": "Diff 모드 종료", - "DiffingMenuTitle": "Diff", - "ViewDiffingOptions": "Diff 메뉴 열기", - "OpenCommandLogMenu": "명령어 로그 메뉴 열기", - "CommitDiff": "커밋의 iff", - "CommitHash": "커밋 해시", - "CommitURL": "커밋 URL", - "CommitMessage": "커밋 메시지", - "CommitAuthor": "커밋 작성자", - "CopyCommitAttributeToClipboard": "커밋 attribute 복사", - "CopyBranchNameToClipboard": "브랜치명을 클립보드에 복사", - "CopyPathToClipboard": "파일명을 클립보드에 복사", - "CopySelectedTextToClipboard": "선택한 텍스트를 클립보드에 복사", - "NoFilesStagedTitle": "파일이 Staged 되지 않았습니다.", - "NoFilesStagedPrompt": "파일이 Staged 되지 않았습니다. 모든 파일을 커밋하시겠습니까?", - "BranchNotFoundTitle": "브랜치를 찾을 수 없습니다.", - "BranchNotFoundPrompt": "브랜치를 찾을 수 없습니다. 새로운 브랜치를 생성합니다.", - "DiscardChangeTitle": "선택한 라인을 unstaged", - "DiscardChangePrompt": "정말로 선택한 라인을 삭제 (git reset) 하시겠습니까? 이 조작은 취소할 수 없습니다.\n이 경고를 비활성화 하려면 설정 파일의 'gui.skipDiscardChangeWarning' 를 true로 설정하세요.", - "CreateNewBranchFromCommit": "커밋에서 새 브랜치를 만듭니다.", - "ViewCommits": "커밋 보기", - "RunningCustomCommandStatus": "커스텀 명령어 실행", - "EnterSubmoduleTooltip": "서브모듈 열기", - "CopySubmoduleNameToClipboard": "서브모듈 이름을 클립보드에 복사", - "RemoveSubmodule": "서브모듈 삭제", - "RemoveSubmodulePrompt": "정말로 서브모듈 '%s'및 해당 디렉토리를 제거하시겠습니까? 이것은 되돌릴 수 없습니다.", - "ResettingSubmoduleStatus": "서브모듈를 리셋", - "NewSubmoduleName": "새로운 서브모듈이름 :", - "NewSubmoduleUrl": "새로운 서브모듈의 URL:", - "NewSubmodulePath": "새로운 서브모듈의 경로", - "NewSubmodule": "새로운 서브모듈 추가", - "AddingSubmoduleStatus": "새로운 서브모듈 추가", - "UpdateSubmoduleUrl": "서브모듈 '%s' 의 URL을 업데이트", - "EditSubmoduleUrl": "서브모듈의 URL을 수정", - "InitializingSubmoduleStatus": "서브모듈 초기화", - "InitSubmoduleTooltip": "서브모듈 초기화", - "SubmoduleUpdateTooltip": "서브모듈 업데이트", - "UpdatingSubmoduleStatus": "서브모듈 업데이트", - "BulkInitSubmodules": "서브모듈 일괄 초기화", - "BulkUpdateSubmodules": "서브모듈 일괄 업데이트", - "SubmodulesTitle": "서브모듈", - "SuggestionsCheatsheetTitle": "추천", - "SuggestionsTitle": "추천 (press %s to focus)", - "ExtrasTitle": "명령어 로그", - "PullRequestURLCopiedToClipboard": "풀 리퀘스트의 URL을 클립보드에 복사했습니다.", - "CommitDiffCopiedToClipboard": "커밋의 Diff를 클립보드에 복사했습니다.", - "CommitURLCopiedToClipboard": "커밋의 URL를 클립보드에 복사했습니다.", - "CommitMessageCopiedToClipboard": "커밋 메시지를 클립보드에 복사했습니다.", - "CommitAuthorCopiedToClipboard": "커밋 작성자를 클립보드에 복사했습니다.", - "CopiedToClipboard": "클립보드에 복사했습니다.", - "ErrCannotEditDirectory": "디렉토리는 편집할 수 없습니다.", - "ErrStageDirWithInlineMergeConflicts": "병합 충돌이 발생한 파일을 포함하는 디렉토리는 Staged/untaged할 수 없습니다. 병합 충돌을 먼저 해결하세요.", - "ErrRepositoryMovedOrDeleted": "저장소를 찾을 수 없습니다. 이미 삭제되었거나 이동되었을 가능성이 있습니다. ¯\\_(ツ)_/¯", - "CommandLog": "명령어 로그", - "ToggleShowCommandLog": "명령어 로그 표시 여부 전환", - "FocusCommandLog": "명령어 로그에 포커스", - "CommandLogHeader": "명령어 로그표시 여부는 '%s' 으로 전환할 수 있습니다.\n", - "RandomTip": "랜덤 Tip", - "ToggleWhitespaceInDiffView": "공백문자를 Diff 뷰에서 표시 여부 전환", - "IncreaseContextInDiffView": "Diff 보기의 변경 사항 주위에 표시되는 컨텍스트의 크기를 늘리기", - "DecreaseContextInDiffView": "Diff 보기의 변경 사항 주위에 표시되는 컨텍스트 크기 줄이기", - "CreatePullRequestOptions": "풀 리퀘스트 생성 옵션", - "DefaultBranch": "기본 브랜치", - "SelectBranch": "브랜치를 선택", - "CreatePullRequest": "풀 리퀘스트 생성", - "SelectConfigFile": "설정파일 선택", - "NoConfigFileFoundErr": "설정 파일을 찾지 못했습니다.", - "LoadingFileSuggestions": "파일 제안 로딩 중", - "LoadingCommits": "커밋 로딩", - "AbortTitle": "%s 중지", - "AbortPrompt": "정말로 실행중인 %s 를 중지할까요?", - "OpenLogMenu": "로그 메뉴 열기", - "LogMenuTitle": "커밋 로그 옵션", - "ShowGitGraph": "커밋 그래프 표시", - "SortCommits": "커밋 정렬", - "OpenCommitInBrowser": "브라우저에서 커밋 열기", - "ViewBisectOptions": "Bisect 옵션 보기", - "RewordInEditorTitle": "커밋 메시지를 에디터에서 수정", - "ToggleRangeSelect": "드래그 선택 전환", - "Actions": { - "CheckoutCommit": "커밋 체크아웃", - "CheckoutTag": "태그 체크아웃", - "CheckoutBranch": "브랜치 체크아웃", - "ForceCheckoutBranch": "브랜치 Force 체크아웃", - "Merge": "병합", - "RebaseBranch": "브랜치 리베이스", - "RenameBranch": "브랜치 이름 변경", - "CreateBranch": "브랜치 생성", - "CherryPick": "(Cherry-pick) 커밋 붙여넣기", - "CheckoutFile": "체크아웃 파일", - "FixupCommit": "커밋 Fixup", - "RewordCommit": "커밋 Reword", - "DropCommit": "커밋 Drop", - "EditCommit": "커밋 수정", - "AmendCommit": "커밋 Amend", - "ResetCommitAuthor": "커밋 작성자 Reset", - "RevertCommit": "커밋 Revert", - "CreateFixupCommit": "Fixup 커밋 생성", - "CopyCommitMessageToClipboard": "커밋 메시지를 클립보드에 복사", - "CopyCommitDiffToClipboard": "커밋 diff를 클립보드에 복사", - "CopyCommitHashToClipboard": "커밋 해시를 클립보드에 복사", - "CopyCommitURLToClipboard": "커밋 URL를 클립보드에 복사", - "CopyCommitAuthorToClipboard": "커밋 작성자를 클립보드에 복사", - "CopyCommitAttributeToClipboard": "클립보드에 복사", - "DiscardAllChangesInFile": "Discard all changes in file", - "DiscardAllUnstagedChangesInFile": "Discard all unstaged changes in file", - "IgnoreExcludeFile": "Ignore file", - "Commit": "커밋", - "Push": "푸시", - "Pull": "업데이트(Pull)", - "OpenFile": "파일 열기", - "CopyToClipboard": "클립보드에 복사", - "CopySelectedTextToClipboard": "선택한 텍스트를 클립보드에 복사", - "DeleteRemoteBranch": "원격 브랜치 삭제", - "RemoveSubmodule": "서브모듈 삭제", - "ResetSubmodule": "서브모듈 Reset", - "AddSubmodule": "서브모듈 추가", - "UpdateSubmoduleUrl": "서브모듈 URL 업데이트", - "InitialiseSubmodule": "서브모듈 초기화", - "UpdateSubmodule": "서브모듈 업데이트", - "PushTag": "태그 푸시g", - "DiscardUnstagedFileChanges": "Unstaged 파일 변경사항 버리기", - "RemoveUntrackedFiles": "Untracked 파일 삭제", - "RemoveStagedFiles": "Staged 파일 삭제", - "Undo": "되돌리기", - "Redo": "다시 실행", - "CopyPullRequestURL": "풀 리퀘스트 URL 복사", - "OpenMergeTool": "병합 도구 열기", - "OpenCommitInBrowser": "브라우저에서 커밋 열기", - "OpenPullRequest": "브라우저에서 풀 리퀘스트 열기" - }, - "Bisect": { - "ResetTitle": "'git bisect' 를 리셋", - "ResetPrompt": "정말로 'git bisect' 를 리셋하시겠습니까?", - "ResetOption": "Bisect를 리셋", - "Mark": "Mark %s as %s", - "SkipCurrent": "%s 를 스킵", - "CompleteTitle": "Bisect 완료" - }, - "Log": {}, - "BreakingChangesByVersion": {} + "NotEnoughSpace": "패널을 렌더링 할 공간이 부족합니다.", + "DiffTitle": "변경점", + "FilesTitle": "파일", + "BranchesTitle": "브랜치", + "CommitsTitle": "커밋", + "EasterEgg": "이스터 에그", + "UnstagedChanges": "Staged되지 않은 변경 내용", + "StagedChanges": "Staged된 변경 내용", + "StagingTitle": "메인 패널 (Staging)", + "MergingTitle": "메인 패널 (Merging)", + "NormalTitle": "메인 패널 (Normal)", + "LogTitle": "로그", + "CommitSummary": "커밋 메시지", + "CredentialsUsername": "사용자 이름", + "CredentialsPassword": "패스워드", + "CredentialsPassphrase": "SSH키의 passphrase 입력", + "CredentialsPIN": "SSH키\u001d의 PIN\u001d을 입력", + "CredentialsToken": "SSH 키를 위한 토큰 입력", + "PassUnameWrong": "패스워드, passphrase 또는 사용자 이름이 잘못되었습니다.", + "Commit": "커밋 변경내용", + "CommitTooltip": "스테이징된 변경 사항 커밋.", + "AmendLastCommit": "마지맛 커밋 수정", + "AmendLastCommitTitle": "마지막 커밋 수정", + "SureToAmend": "마지막 커밋을 수정하시겠습니까? 그런 다음 커밋 패널에서 커밋 메시지를 변경할 수 있습니다.", + "NoCommitToAmend": "Amend 가능한 커밋이 없습니다.", + "CommitChangesWithEditor": "Git 편집기를 사용하여 변경 내용을 커밋합니다.", + "NoBaseCommitsFound": "기본 커밋을 찾을 수 없습니다", + "MultipleBaseCommitsFoundStaged": "여러 개의 기본 커밋을 찾았습니다. (한 번에 더 적은 변경 사항을 스테이징해보세요)", + "MultipleBaseCommitsFoundUnstaged": "여러 개의 기본 커밋을 찾았습니다. (변경 사항 중 일부를 스테이징해보세요)", + "BaseCommitIsAlreadyOnMainBranch": "이 변경 사항의 기본 커밋은 이미 메인 브랜치에 있습니다", + "StatusTitle": "상태", + "GlobalTitle": "글로벌 키 바인딩", + "Execute": "실행", + "Stage": "Staged 전환", + "ToggleStagedAll": "모든 변경을 Staged/unstaged으로 전환", + "ToggleTreeView": "파일 트리뷰로 전환", + "OpenMergeTool": "Git mergetool를 열기", + "Refresh": "새로고침", + "Push": "푸시", + "Pull": "업데이트", + "FileFilter": "파일을 필터하기 (Staged/unstaged)", + "CopyToClipboardMenu": "클립보드에 복사", + "CopyFileName": "파일명", + "CopySelectedDiff": "선택한 파일의 변경점", + "CopyAllFilesDiff": "모든 파일의 변경점", + "NoContentToCopyError": "복사 대상이 없습니다", + "FileNameCopiedToast": "파일명을 클립보드에 복사했습니다.", + "FilePathCopiedToast": "파일경로를 클립보드에 복사했습니다.", + "FileDiffCopiedToast": "파일의 변경점을 클립보드에 복사했습니다.", + "AllFilesDiffCopiedToast": "모든 파일의 변경점을 클립보드에 복사했습니다.", + "FilterStagedFiles": "Staged된 파일만 표시", + "FilterUnstagedFiles": "Stage되지 않은 파일만 표시", + "MergeConflictsTitle": "병합 충돌", + "Checkout": "체크아웃", + "NoChangedFiles": "변경된 파일이 없습니다.", + "SoftReset": "소프트 리셋", + "AlreadyCheckedOutBranch": "브랜치가 이미 체크아웃 되었습니다", + "SureForceCheckout": "강제로 체크아웃하시겠습니까? 모든 로컬 변경 사항을 잃게 됩니다.", + "ForceCheckoutBranch": "브랜치 강제 체크아웃", + "BranchName": "브랜치 이름", + "NewBranchNameBranchOff": "새 브랜치 이름 (branch is off of '{{.branchName}}')", + "CantDeleteCheckOutBranch": "체크아웃하는 브랜치는 삭제할 수 없습니다!", + "DeleteBranchTitle": "'{{.selectedBranchName}}' 브랜치를 삭제하시겠습니까?", + "DeleteLocalBranch": "로컬 브랜치를 삭제", + "ForceDeleteBranchTitle": "브랜치를 강제 삭제", + "ForceDeleteBranchMessage": "'{{.selectedBranchName}}'는 완전히 병합되지 않았습니다. 정말 삭제하시겠습니까?", + "RebaseBranch": "체크아웃된 브랜치를 이 브랜치에 리베이스", + "CantRebaseOntoSelf": "브랜치를 자기 자신에게 리베이스할 수는 없습니다.", + "CantMergeBranchIntoItself": "브랜치를 자기 자신에게 병합할 수는 없습니다.", + "ForceCheckout": "강제 체크아웃", + "CheckoutByName": "이름으로 체크아웃", + "NewBranch": "새 브랜치 생성", + "NoBranchesThisRepo": "저장소에 브랜치가 존재하지 않습니다.", + "CommitWithoutMessageErr": "커밋 메시지를 입력하세요.", + "Close": "닫기", + "CloseCancel": "닫기/취소", + "Confirm": "확인", + "Quit": "종료", + "SureSquashThisCommit": "Are you sure you want to squash this commit into the commit below?", + "Squash": "스쿼시", + "PickCommitTooltip": "Pick commit (when mid-rebase)", + "Reword": "커밋메시지 변경", + "DropCommit": "커밋 삭제", + "MoveDownCommit": "커밋을 1개 아래로 이동", + "MoveUpCommit": "커밋을 1개 위로 이동", + "EditCommitTooltip": "커밋을 편집", + "AmendCommitTooltip": "Amend commit with staged changes", + "ResetAuthor": "Reset commit author", + "RewordCommitEditor": "에디터에서 커밋메시지 수정", + "NoCommitsThisBranch": "이 브랜치에 커밋이 없습니다.", + "Error": "오류", + "Undo": "되돌리기", + "UndoReflog": "되돌리기 (reflog) (실험적)", + "RedoReflog": "다시 실행 (reflog) (실험적)", + "Apply": "적용", + "NoStashEntries": "Stash가 존재하지 않습니다.", + "StashDrop": "Stash를 삭제", + "StashPop": "Stash를 pop", + "SurePopStashEntry": "정말로 Stash를 pop하시겠습니까?", + "StashApply": "Stash 적용", + "SureApplyStashEntry": "정말로 Stash를 적용하시겠습니까?", + "StashChanges": "변경을 Stash", + "OpenConfig": "설정 파일 열기", + "EditConfig": "설정 파일 수정", + "ForcePush": "강제 푸시", + "ForcePushPrompt": "브랜치가 원격 브랜치에서 분기하고 있습니다. 'esc'를 눌러 취소하거나, 'enter'를 눌러 강제로 푸시하세요.", + "ForcePushDisabled": "브랜치가 원격 브랜치에서 분기하고 있습니다. force push가 비활성화 되었습니다.", + "UpdatesRejectedAndForcePushDisabled": "업데이트가 거부되었으며 강제 푸시를 비활성화했습니다.", + "CheckForUpdate": "업데이트 확인", + "CheckingForUpdates": "업데이트 확인 중...", + "UpdateAvailableTitle": "새로운 업데이트 사용가능!", + "UpdateAvailable": "버전 {{.newVersion}} 을(를) 설치하시겠습니까?", + "UpdateInProgressWaitingStatus": "업데이트 중", + "UpdateCompletedTitle": "업데이트 완료!", + "UpdateCompleted": "업데이트 설치에 성공했습니다. lazygit를 재시작해주세요.", + "FailedToRetrieveLatestVersionErr": "버전 정보를 받아오는데 실패했습니다.", + "OnLatestVersionErr": "이미 최신 버전을 사용하고 있습니다.", + "MajorVersionErr": "새 버전 ({{.newVersion}}) 에 현재 버전({{.currentVersion}}) 과 비교할 때 호환되지 않는 변경 사항이 있습니다.", + "CouldNotFindBinaryErr": "{{.url}} 에서 바이너리를 찾을 수 없습니다.", + "UpdateFailedErr": "업데이트 실패: {{.errMessage}}", + "ConfirmQuitDuringUpdateTitle": "현재 업데이트 중입니다.", + "ConfirmQuitDuringUpdate": "현재 업데이트를 진행 중입니다.종료하시겠습니까?", + "GitconfigParseErr": "따옴표로 묶이지 않은 '\\' 문자가 있어서 Gogit이 gitconfig 파일을 분석하지 못했습니다. 이를 제거하면 문제가 해결됩니다.", + "EditFile": "파일 편집", + "OpenFile": "파일 닫기", + "IgnoreFile": ".gitignore에 추가", + "RefreshFiles": "파일 새로고침", + "Merge": "현재 브랜치에 병합", + "ConfirmQuit": "정말로 종료하시겠습니까?", + "SwitchRepo": "최근에 사용한 저장소로 전환", + "UnsupportedGitService": "지원되지 않는 Git 서비스입니다.", + "CopyPullRequestURL": "풀 리퀘스트 URL을 클립보드에 복사", + "NoBranchOnRemote": "브랜치가 원격에 없습니다. 원격에 먼저 푸시해야합니다.", + "FileEnter": "Stage individual hunks/lines for file, or collapse/expand for directory", + "StageSelectionTooltip": "선택한 행을 staged / unstaged", + "DiscardSelection": "변경을 삭제 (git reset)", + "ToggleSelectionForPatch": "Line(s)을 패치에 추가/삭제", + "ToggleStagingView": "패널 전환", + "ReturnToFilesPanel": "파일 목록으로 돌아가기", + "FastForward": "Fast-forward this branch from its upstream", + "FoundConflictsTitle": "Auto-merge failed", + "RecentRepos": "최근에 사용한 저장소", + "CommitSummaryTitle": "커밋메시지", + "LocalBranchesTitle": "브랜치", + "SearchTitle": "검색", + "TagsTitle": "태그", + "MenuTitle": "메뉴", + "RemotesTitle": "원격", + "RemoteBranchesTitle": "원격 브랜치", + "PatchBuildingTitle": "메인 패널 (Patch Building)", + "InformationTitle": "정보", + "ErrorOccurred": "오류가 발생했습니다! issue를 작성해 주세요: ", + "CherryPickCopy": "커밋을 복사 (cherry-pick)", + "PasteCommits": "커밋을 붙여넣기 (cherry-pick)", + "CherryPick": "체리픽", + "Donate": "후원", + "AskQuestion": "질문하기", + "PrevHunk": "이전 hunk를 선택", + "NextHunk": "다음 hunk를 선택", + "PrevConflict": "이전 충돌을 선택", + "NextConflict": "다음 충돌을 선택", + "SelectPrevHunk": "이전 hunk를 선택", + "SelectNextHunk": "다음 hunk를 선택", + "ScrollDown": "아래로 스크롤", + "ScrollUp": "위로 스크롤", + "ScrollUpMainWindow": "메인 패널을 위로 스크롤", + "ScrollDownMainWindow": "메인 패널을 아래로로 스크롤", + "DropCommitTitle": "커밋 삭제", + "DropCommitPrompt": "정말로 선택한 커밋을 삭제하시겠습니까?", + "PullingStatus": "업데이트 중", + "PushingStatus": "푸시 중", + "FetchingStatus": "패치 중", + "SubCommitsDynamicTitle": "커밋 (%s)", + "RemoteBranchesDynamicTitle": "원격브랜치 (%s)", + "ViewItemFiles": "View selected item's files", + "CommitFilesTitle": "커밋 파일", + "CheckoutCommitFileTooltip": "Checkout file", + "DiscardOldFileChangeTooltip": "Discard this commit's changes to this file", + "DiscardFileChangesTitle": "파일 변경 사항 버리기", + "Discard": "View 'discard changes' options", + "Cancel": "취소", + "DiscardAllChanges": "모든 변경사항 버리기", + "Delete": "삭제", + "Reset": "초기화", + "ViewResetOptions": "View reset options", + "CreateFixupCommitTooltip": "Create fixup commit for this commit", + "SquashAboveCommitsTooltip": "Squash all 'fixup!' commits above selected commit (autosquash)", + "PressEnterToReturn": "엔터를 눌러 lazygit으로 돌아갑니다.", + "ViewStashOptions": "Stash 옵션 보기", + "StashAllChanges": "변경사항을 Stash", + "StashOptions": "Stash 옵션", + "ScrollLeft": "우 스크롤", + "ScrollRight": "좌 스크롤", + "DiscardPatch": "Patch 버리기", + "ToggleAllInPatch": "Toggle all files included in patch", + "ViewPatchOptions": "커스텀 Patch 옵션 보기", + "PatchOptionsTitle": "Patch 옵션", + "EnterCommitFile": "Enter file to add selected lines to the patch (or toggle directory collapsed)", + "EnterUpstream": "' '와 같은 형식으로 입력하세요.", + "InvalidUpstream": "Upstream의 형식이 잘못되었습니다.' ' 와 같은 형식으로 입력하세요.", + "NewRemote": "새로운 Remote 추가", + "NewRemoteName": "새로운 Remote 이름:", + "NewRemoteUrl": "새로운 Remote URL:", + "EditRemoteName": "{{.remoteName}} 의 새로운 Remote 이름 입력:", + "EditRemoteUrl": "{{.remoteName}} 의 새로운 Remote URL 입력:", + "RemoveRemote": "Remote를 삭제", + "DeleteRemoteBranch": "원격 브랜치를 삭제", + "SetUpstream": "Set as upstream of checked-out branch", + "EditRemoteTooltip": "Remote를 수정", + "TagNameTitle": "태그 이름", + "TagMessageTitle": "태그 메시지", + "PushTagTitle": "원격에 태그 '{{.tagName}}' 를 푸시", + "PushTag": "태그를 push", + "NewTag": "태그를 생성", + "FetchRemoteTooltip": "원격을 업데이트", + "GitFlowOptions": "Git-flow 옵션 보기", + "NewBranchNamePrompt": "새로운 브랜치 이름 입력", + "NextScreenMode": "다음 스크린 모드 (normal/half/fullscreen)", + "PrevScreenMode": "이전 스크린 모드", + "StartSearch": "검색 시작", + "Keybindings": "키 바인딩", + "RenameBranch": "브랜치 이름 변경", + "OpenKeybindingsMenu": "매뉴 열기", + "ResetCherryPick": "Reset cherry-picked (copied) commits selection", + "NextTab": "이전 탭", + "PrevTab": "다음 탭", + "CantUndoWhileRebasing": "리베이스중에는 되돌릴 수 없습니다.", + "CantRedoWhileRebasing": "리베이스중에는 다시 실행할 수 없습니다.", + "ConfirmationTitle": "확인 패널", + "PrevPage": "이전 페이지", + "NextPage": "다음 페이지", + "GotoTop": "맨 위로 스크롤 ", + "GotoBottom": "맨 아래로 스크롤 ", + "ResetInParentheses": "(reset)", + "OpenFilteringMenu": "View filter-by-path options", + "ExitFilterMode": "Stop filtering by path", + "MustExitFilterModePrompt": "Command not available in filtered mode. Exit filtered mode?", + "EnterRefName": "Ref 입력:", + "ExitDiffMode": "Diff 모드 종료", + "DiffingMenuTitle": "Diff", + "ViewDiffingOptions": "Diff 메뉴 열기", + "OpenCommandLogMenu": "명령어 로그 메뉴 열기", + "CommitDiff": "커밋의 iff", + "CommitHash": "커밋 해시", + "CommitURL": "커밋 URL", + "CommitMessage": "커밋 메시지", + "CommitAuthor": "커밋 작성자", + "CopyCommitAttributeToClipboard": "커밋 attribute 복사", + "CopyBranchNameToClipboard": "브랜치명을 클립보드에 복사", + "CopyPathToClipboard": "파일명을 클립보드에 복사", + "CopySelectedTextToClipboard": "선택한 텍스트를 클립보드에 복사", + "NoFilesStagedTitle": "파일이 Staged 되지 않았습니다.", + "NoFilesStagedPrompt": "파일이 Staged 되지 않았습니다. 모든 파일을 커밋하시겠습니까?", + "BranchNotFoundTitle": "브랜치를 찾을 수 없습니다.", + "BranchNotFoundPrompt": "브랜치를 찾을 수 없습니다. 새로운 브랜치를 생성합니다.", + "DiscardChangeTitle": "선택한 라인을 unstaged", + "DiscardChangePrompt": "정말로 선택한 라인을 삭제 (git reset) 하시겠습니까? 이 조작은 취소할 수 없습니다.\n이 경고를 비활성화 하려면 설정 파일의 'gui.skipDiscardChangeWarning' 를 true로 설정하세요.", + "CreateNewBranchFromCommit": "커밋에서 새 브랜치를 만듭니다.", + "ViewCommits": "커밋 보기", + "RunningCustomCommandStatus": "커스텀 명령어 실행", + "EnterSubmoduleTooltip": "서브모듈 열기", + "CopySubmoduleNameToClipboard": "서브모듈 이름을 클립보드에 복사", + "RemoveSubmodule": "서브모듈 삭제", + "RemoveSubmodulePrompt": "정말로 서브모듈 '%s'및 해당 디렉토리를 제거하시겠습니까? 이것은 되돌릴 수 없습니다.", + "ResettingSubmoduleStatus": "서브모듈를 리셋", + "NewSubmoduleName": "새로운 서브모듈이름 :", + "NewSubmoduleUrl": "새로운 서브모듈의 URL:", + "NewSubmodulePath": "새로운 서브모듈의 경로", + "NewSubmodule": "새로운 서브모듈 추가", + "AddingSubmoduleStatus": "새로운 서브모듈 추가", + "UpdateSubmoduleUrl": "서브모듈 '%s' 의 URL을 업데이트", + "EditSubmoduleUrl": "서브모듈의 URL을 수정", + "InitializingSubmoduleStatus": "서브모듈 초기화", + "InitSubmoduleTooltip": "서브모듈 초기화", + "SubmoduleUpdateTooltip": "서브모듈 업데이트", + "UpdatingSubmoduleStatus": "서브모듈 업데이트", + "BulkInitSubmodules": "서브모듈 일괄 초기화", + "BulkUpdateSubmodules": "서브모듈 일괄 업데이트", + "SubmodulesTitle": "서브모듈", + "SuggestionsCheatsheetTitle": "추천", + "SuggestionsTitle": "추천 (press %s to focus)", + "ExtrasTitle": "명령어 로그", + "PullRequestURLCopiedToClipboard": "풀 리퀘스트의 URL을 클립보드에 복사했습니다.", + "CommitDiffCopiedToClipboard": "커밋의 Diff를 클립보드에 복사했습니다.", + "CommitURLCopiedToClipboard": "커밋의 URL를 클립보드에 복사했습니다.", + "CommitMessageCopiedToClipboard": "커밋 메시지를 클립보드에 복사했습니다.", + "CommitAuthorCopiedToClipboard": "커밋 작성자를 클립보드에 복사했습니다.", + "CopiedToClipboard": "클립보드에 복사했습니다.", + "ErrCannotEditDirectory": "디렉토리는 편집할 수 없습니다.", + "ErrStageDirWithInlineMergeConflicts": "병합 충돌이 발생한 파일을 포함하는 디렉토리는 Staged/untaged할 수 없습니다. 병합 충돌을 먼저 해결하세요.", + "ErrRepositoryMovedOrDeleted": "저장소를 찾을 수 없습니다. 이미 삭제되었거나 이동되었을 가능성이 있습니다. ¯\\_(ツ)_/¯", + "CommandLog": "명령어 로그", + "ToggleShowCommandLog": "명령어 로그 표시 여부 전환", + "FocusCommandLog": "명령어 로그에 포커스", + "CommandLogHeader": "명령어 로그표시 여부는 '%s' 으로 전환할 수 있습니다.\n", + "RandomTip": "랜덤 Tip", + "ToggleWhitespaceInDiffView": "공백문자를 Diff 뷰에서 표시 여부 전환", + "IncreaseContextInDiffView": "Diff 보기의 변경 사항 주위에 표시되는 컨텍스트의 크기를 늘리기", + "DecreaseContextInDiffView": "Diff 보기의 변경 사항 주위에 표시되는 컨텍스트 크기 줄이기", + "CreatePullRequestOptions": "풀 리퀘스트 생성 옵션", + "DefaultBranch": "기본 브랜치", + "SelectBranch": "브랜치를 선택", + "CreatePullRequest": "풀 리퀘스트 생성", + "SelectConfigFile": "설정파일 선택", + "NoConfigFileFoundErr": "설정 파일을 찾지 못했습니다.", + "LoadingFileSuggestions": "파일 제안 로딩 중", + "LoadingCommits": "커밋 로딩", + "AbortTitle": "%s 중지", + "AbortPrompt": "정말로 실행중인 %s 를 중지할까요?", + "OpenLogMenu": "로그 메뉴 열기", + "LogMenuTitle": "커밋 로그 옵션", + "ShowGitGraph": "커밋 그래프 표시", + "SortCommits": "커밋 정렬", + "OpenCommitInBrowser": "브라우저에서 커밋 열기", + "ViewBisectOptions": "Bisect 옵션 보기", + "RewordInEditorTitle": "커밋 메시지를 에디터에서 수정", + "ToggleRangeSelect": "드래그 선택 전환", + "Actions": { + "CheckoutCommit": "커밋 체크아웃", + "CheckoutTag": "태그 체크아웃", + "CheckoutBranch": "브랜치 체크아웃", + "ForceCheckoutBranch": "브랜치 Force 체크아웃", + "Merge": "병합", + "RebaseBranch": "브랜치 리베이스", + "RenameBranch": "브랜치 이름 변경", + "CreateBranch": "브랜치 생성", + "CherryPick": "(Cherry-pick) 커밋 붙여넣기", + "CheckoutFile": "체크아웃 파일", + "FixupCommit": "커밋 Fixup", + "RewordCommit": "커밋 Reword", + "DropCommit": "커밋 Drop", + "EditCommit": "커밋 수정", + "AmendCommit": "커밋 Amend", + "ResetCommitAuthor": "커밋 작성자 Reset", + "RevertCommit": "커밋 Revert", + "CreateFixupCommit": "Fixup 커밋 생성", + "CopyCommitMessageToClipboard": "커밋 메시지를 클립보드에 복사", + "CopyCommitDiffToClipboard": "커밋 diff를 클립보드에 복사", + "CopyCommitHashToClipboard": "커밋 해시를 클립보드에 복사", + "CopyCommitURLToClipboard": "커밋 URL를 클립보드에 복사", + "CopyCommitAuthorToClipboard": "커밋 작성자를 클립보드에 복사", + "CopyCommitAttributeToClipboard": "클립보드에 복사", + "DiscardAllChangesInFile": "Discard all changes in file", + "DiscardAllUnstagedChangesInFile": "Discard all unstaged changes in file", + "IgnoreExcludeFile": "Ignore file", + "Commit": "커밋", + "Push": "푸시", + "Pull": "업데이트(Pull)", + "OpenFile": "파일 열기", + "CopyToClipboard": "클립보드에 복사", + "CopySelectedTextToClipboard": "선택한 텍스트를 클립보드에 복사", + "DeleteRemoteBranch": "원격 브랜치 삭제", + "RemoveSubmodule": "서브모듈 삭제", + "ResetSubmodule": "서브모듈 Reset", + "AddSubmodule": "서브모듈 추가", + "UpdateSubmoduleUrl": "서브모듈 URL 업데이트", + "InitialiseSubmodule": "서브모듈 초기화", + "UpdateSubmodule": "서브모듈 업데이트", + "PushTag": "태그 푸시g", + "DiscardUnstagedFileChanges": "Unstaged 파일 변경사항 버리기", + "RemoveUntrackedFiles": "Untracked 파일 삭제", + "RemoveStagedFiles": "Staged 파일 삭제", + "Undo": "되돌리기", + "Redo": "다시 실행", + "CopyPullRequestURL": "풀 리퀘스트 URL 복사", + "OpenMergeTool": "병합 도구 열기", + "OpenCommitInBrowser": "브라우저에서 커밋 열기", + "OpenPullRequest": "브라우저에서 풀 리퀘스트 열기" + }, + "Bisect": { + "ResetTitle": "'git bisect' 를 리셋", + "ResetPrompt": "정말로 'git bisect' 를 리셋하시겠습니까?", + "ResetOption": "Bisect를 리셋", + "Mark": "Mark %s as %s", + "SkipCurrent": "%s 를 스킵", + "CompleteTitle": "Bisect 완료" + }, + "Log": {}, + "BreakingChangesByVersion": {} } diff --git a/pkg/integration/tests/interactive_rebase/outside_rebase_range_select.go b/pkg/integration/tests/interactive_rebase/outside_rebase_range_select.go index 4aeb28b2897..bb42b3d95c3 100644 --- a/pkg/integration/tests/interactive_rebase/outside_rebase_range_select.go +++ b/pkg/integration/tests/interactive_rebase/outside_rebase_range_select.go @@ -49,7 +49,7 @@ var OutsideRebaseRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{ Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Squash")). - Content(Contains("Are you sure you want to squash the selected commit(s) into the commit below?")). + Content(Contains("Are you sure you want to squash the selected commit(s) into the parent commit below?")). Confirm() }). TopLines( diff --git a/pkg/integration/tests/interactive_rebase/squash_down_second_commit.go b/pkg/integration/tests/interactive_rebase/squash_down_second_commit.go index 6ba313f7a71..6068f8faafd 100644 --- a/pkg/integration/tests/interactive_rebase/squash_down_second_commit.go +++ b/pkg/integration/tests/interactive_rebase/squash_down_second_commit.go @@ -27,7 +27,7 @@ var SquashDownSecondCommit = NewIntegrationTest(NewIntegrationTestArgs{ Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Squash")). - Content(Equals("Are you sure you want to squash the selected commit(s) into the commit below?")). + Content(Equals("Are you sure you want to squash the selected commit(s) into the parent commit below?")). Confirm() }). Lines(