[PR #212] Fix reset using treeish references #328

Closed
opened 2026-03-02 04:13:19 +03:00 by kerem · 0 comments
Owner

Original Pull Request: https://github.com/git-ai-project/git-ai/pull/212

State: closed
Merged: Yes


Fixes #169

@AtnesNess - the problem was that we weren't resolving HEAD~1 until AFTER the reset happened leading to the parent of the parent being resolved 👎 . Now it computes the reference before forwarding to git

===================================================================
git-ai Issue #169: Reset and Recommit Attribution Bug
===================================================================

Creating clean repository in: /var/folders/qp/df8pj1yn36z_6hgjykzkr7_c0000gn/T/tmp.B3Ovopeq2x

Step 1: Initializing git repository...
Initialized empty Git repository in /private/var/folders/qp/df8pj1yn36z_6hgjykzkr7_c0000gn/T/tmp.B3Ovopeq2x/.git/
[main (root-commit) 4f66e56] Initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
you  ████████████████████████████████████████ ai
     100%                                   0%

Step 2: Creating Commit 1 - AI creates module1.py...
ai_agent mock_ai changed 1 file(s) that have changed since the last commit
Checkpoint completed in 170.113583ms
[main 491cdda] Commit 1: AI creates module1.py
 1 file changed, 3 insertions(+)
 create mode 100644 module1.py
you  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ai
     0%                                  100%
     100% AI code accepted
  Commit 1 SHA: 491cddad07a1ebd0b9d4740d2ded346d3067e293
=== Blame for module1.py ===
491cdda (mock_ai 2025-11-11 11:12:43 -0500 1) def function_one():
491cdda (mock_ai 2025-11-11 11:12:43 -0500 2)     print("AI generated function 1")
491cdda (mock_ai 2025-11-11 11:12:43 -0500 3)     return 1

Step 3: Checking Commit 1 stats...
{
  "human_additions": 0,
  "mixed_additions": 0,
  "ai_additions": 3,
  "ai_accepted": 3,
  "total_ai_additions": 3,
  "total_ai_deletions": 0,
  "time_waiting_for_ai": 0,
  "git_diff_deleted_lines": 0,
  "git_diff_added_lines": 3,
  "tool_model_breakdown": {
    "mock_ai::unknown": {
      "ai_additions": 3,
      "mixed_additions": 0,
      "ai_accepted": 3,
      "total_ai_additions": 3,
      "total_ai_deletions": 0,
      "time_waiting_for_ai": 0
    }
  }
}

Step 4: Creating Commit 2 - AI creates module2.py...
ai_agent mock_ai changed 1 file(s) that have changed since the last commit
Checkpoint completed in 169.678875ms
[main 707446b] Commit 2: AI creates module2.py
 1 file changed, 5 insertions(+)
 create mode 100644 module2.py
you  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ai
     0%                                  100%
     100% AI code accepted
  Commit 2 SHA: 707446ba1578041a6f279f0b6ee42219cea27d21
=== Blame for module2.py ===
707446b (mock_ai 2025-11-11 11:12:44 -0500 1) def function_two():
707446b (mock_ai 2025-11-11 11:12:44 -0500 2)     print("AI generated function 2")
707446b (mock_ai 2025-11-11 11:12:44 -0500 3)     return 2
707446b (mock_ai 2025-11-11 11:12:44 -0500 4) def helper():
707446b (mock_ai 2025-11-11 11:12:44 -0500 5)     return "helper"

Step 5: Checking Commit 2 stats (BEFORE reset)...
{
  "human_additions": 0,
  "mixed_additions": 0,
  "ai_additions": 5,
  "ai_accepted": 5,
  "total_ai_additions": 5,
  "total_ai_deletions": 0,
  "time_waiting_for_ai": 0,
  "git_diff_deleted_lines": 0,
  "git_diff_added_lines": 5,
  "tool_model_breakdown": {
    "mock_ai::unknown": {
      "ai_additions": 5,
      "mixed_additions": 0,
      "ai_accepted": 5,
      "total_ai_additions": 5,
      "total_ai_deletions": 0,
      "time_waiting_for_ai": 0
    }
  }
}

Step 6: Resetting last commit (soft reset)...
[git-ai] Reset: tree-ish='HEAD~1', pathspecs=[]
[git-ai] Reconstructing working log after reset from 707446ba1578041a6f279f0b6ee42219cea27d21 to 491cddad07a1ebd0b9d4740d2ded346d3067e293
[git-ai] Processing 1 files for reset authorship reconstruction
[git-ai] Built old_head VA with 1 files, 1 prompts
[git-ai] Built target VA with 0 files, 0 prompts
[git-ai] Read 1 files from working directory
[git-ai] Merged VAs, result has 1 files
[git-ai] Generated INITIAL attributions for 1 files, 0 attestations, 1 prompts
[git-ai] ✓ Wrote INITIAL attributions to working log for 491cddad07a1ebd0b9d4740d2ded346d3067e293
[git-ai] ✓ Successfully reconstructed working log after reset to 491cddad07a1ebd0b9d4740d2ded346d3067e293
  Current HEAD: 491cddad07a1ebd0b9d4740d2ded346d3067e293
  Should match Commit 1: 491cddad07a1ebd0b9d4740d2ded346d3067e293
  ✓ HEAD is back at Commit 1

  Git status after reset:
A  module2.py

Step 7: Recommitting the changes...
[main fb69764] Commit 2 (recommitted): AI creates module2.py
 1 file changed, 5 insertions(+)
 create mode 100644 module2.py
you  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ai
     0%                                  100%
     100% AI code accepted
  New Commit 2 SHA: fb6976432b26ebd962021a739938181018190340

Step 8: Checking Commit 2 stats (AFTER reset and recommit)...
{
  "human_additions": 0,
  "mixed_additions": 0,
  "ai_additions": 5,
  "ai_accepted": 5,
  "total_ai_additions": 0,
  "total_ai_deletions": 0,
  "time_waiting_for_ai": 0,
  "git_diff_deleted_lines": 0,
  "git_diff_added_lines": 5,
  "tool_model_breakdown": {
    "mock_ai::unknown": {
      "ai_additions": 0,
      "mixed_additions": 0,
      "ai_accepted": 5,
      "total_ai_additions": 0,
      "total_ai_deletions": 0,
      "time_waiting_for_ai": 0
    }
  }
}

Step 9: Checking blame outputs...

=== Blame for module1.py ===
491cdda (mock_ai 2025-11-11 11:12:43 -0500 1) def function_one():
491cdda (mock_ai 2025-11-11 11:12:43 -0500 2)     print("AI generated function 1")
491cdda (mock_ai 2025-11-11 11:12:43 -0500 3)     return 1

=== Blame for module2.py ===
fb69764 (mock_ai 2025-11-11 11:12:45 -0500 1) def function_two():
fb69764 (mock_ai 2025-11-11 11:12:45 -0500 2)     print("AI generated function 2")
fb69764 (mock_ai 2025-11-11 11:12:45 -0500 3)     return 2
fb69764 (mock_ai 2025-11-11 11:12:45 -0500 4) def helper():
fb69764 (mock_ai 2025-11-11 11:12:45 -0500 5)     return "helper"

===================================================================
VERIFICATION
===================================================================

✅ PASS: Commit 2 (before reset) shows ai_additions: 5
✅ PASS: Commit 2 (after recommit) shows ai_additions: 5
✅ PASS: module1.py shows mock_ai attribution
✅ PASS: module2.py shows mock_ai attribution

===================================================================
Repository Location: /var/folders/qp/df8pj1yn36z_6hgjykzkr7_c0000gn/T/tmp.B3Ovopeq2x
===================================================================
aidancunniffe@Aidans-iMac git-ai % 
**Original Pull Request:** https://github.com/git-ai-project/git-ai/pull/212 **State:** closed **Merged:** Yes --- Fixes #169 @AtnesNess - the problem was that we weren't resolving HEAD~1 until AFTER the reset happened leading to the parent of the parent being resolved 👎 . Now it computes the reference before forwarding to git ``` =================================================================== git-ai Issue #169: Reset and Recommit Attribution Bug =================================================================== Creating clean repository in: /var/folders/qp/df8pj1yn36z_6hgjykzkr7_c0000gn/T/tmp.B3Ovopeq2x Step 1: Initializing git repository... Initialized empty Git repository in /private/var/folders/qp/df8pj1yn36z_6hgjykzkr7_c0000gn/T/tmp.B3Ovopeq2x/.git/ [main (root-commit) 4f66e56] Initial commit 1 file changed, 1 insertion(+) create mode 100644 README.md you ████████████████████████████████████████ ai 100% 0% Step 2: Creating Commit 1 - AI creates module1.py... ai_agent mock_ai changed 1 file(s) that have changed since the last commit Checkpoint completed in 170.113583ms [main 491cdda] Commit 1: AI creates module1.py 1 file changed, 3 insertions(+) create mode 100644 module1.py you ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ai 0% 100% 100% AI code accepted Commit 1 SHA: 491cddad07a1ebd0b9d4740d2ded346d3067e293 === Blame for module1.py === 491cdda (mock_ai 2025-11-11 11:12:43 -0500 1) def function_one(): 491cdda (mock_ai 2025-11-11 11:12:43 -0500 2) print("AI generated function 1") 491cdda (mock_ai 2025-11-11 11:12:43 -0500 3) return 1 Step 3: Checking Commit 1 stats... { "human_additions": 0, "mixed_additions": 0, "ai_additions": 3, "ai_accepted": 3, "total_ai_additions": 3, "total_ai_deletions": 0, "time_waiting_for_ai": 0, "git_diff_deleted_lines": 0, "git_diff_added_lines": 3, "tool_model_breakdown": { "mock_ai::unknown": { "ai_additions": 3, "mixed_additions": 0, "ai_accepted": 3, "total_ai_additions": 3, "total_ai_deletions": 0, "time_waiting_for_ai": 0 } } } Step 4: Creating Commit 2 - AI creates module2.py... ai_agent mock_ai changed 1 file(s) that have changed since the last commit Checkpoint completed in 169.678875ms [main 707446b] Commit 2: AI creates module2.py 1 file changed, 5 insertions(+) create mode 100644 module2.py you ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ai 0% 100% 100% AI code accepted Commit 2 SHA: 707446ba1578041a6f279f0b6ee42219cea27d21 === Blame for module2.py === 707446b (mock_ai 2025-11-11 11:12:44 -0500 1) def function_two(): 707446b (mock_ai 2025-11-11 11:12:44 -0500 2) print("AI generated function 2") 707446b (mock_ai 2025-11-11 11:12:44 -0500 3) return 2 707446b (mock_ai 2025-11-11 11:12:44 -0500 4) def helper(): 707446b (mock_ai 2025-11-11 11:12:44 -0500 5) return "helper" Step 5: Checking Commit 2 stats (BEFORE reset)... { "human_additions": 0, "mixed_additions": 0, "ai_additions": 5, "ai_accepted": 5, "total_ai_additions": 5, "total_ai_deletions": 0, "time_waiting_for_ai": 0, "git_diff_deleted_lines": 0, "git_diff_added_lines": 5, "tool_model_breakdown": { "mock_ai::unknown": { "ai_additions": 5, "mixed_additions": 0, "ai_accepted": 5, "total_ai_additions": 5, "total_ai_deletions": 0, "time_waiting_for_ai": 0 } } } Step 6: Resetting last commit (soft reset)... [git-ai] Reset: tree-ish='HEAD~1', pathspecs=[] [git-ai] Reconstructing working log after reset from 707446ba1578041a6f279f0b6ee42219cea27d21 to 491cddad07a1ebd0b9d4740d2ded346d3067e293 [git-ai] Processing 1 files for reset authorship reconstruction [git-ai] Built old_head VA with 1 files, 1 prompts [git-ai] Built target VA with 0 files, 0 prompts [git-ai] Read 1 files from working directory [git-ai] Merged VAs, result has 1 files [git-ai] Generated INITIAL attributions for 1 files, 0 attestations, 1 prompts [git-ai] ✓ Wrote INITIAL attributions to working log for 491cddad07a1ebd0b9d4740d2ded346d3067e293 [git-ai] ✓ Successfully reconstructed working log after reset to 491cddad07a1ebd0b9d4740d2ded346d3067e293 Current HEAD: 491cddad07a1ebd0b9d4740d2ded346d3067e293 Should match Commit 1: 491cddad07a1ebd0b9d4740d2ded346d3067e293 ✓ HEAD is back at Commit 1 Git status after reset: A module2.py Step 7: Recommitting the changes... [main fb69764] Commit 2 (recommitted): AI creates module2.py 1 file changed, 5 insertions(+) create mode 100644 module2.py you ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ai 0% 100% 100% AI code accepted New Commit 2 SHA: fb6976432b26ebd962021a739938181018190340 Step 8: Checking Commit 2 stats (AFTER reset and recommit)... { "human_additions": 0, "mixed_additions": 0, "ai_additions": 5, "ai_accepted": 5, "total_ai_additions": 0, "total_ai_deletions": 0, "time_waiting_for_ai": 0, "git_diff_deleted_lines": 0, "git_diff_added_lines": 5, "tool_model_breakdown": { "mock_ai::unknown": { "ai_additions": 0, "mixed_additions": 0, "ai_accepted": 5, "total_ai_additions": 0, "total_ai_deletions": 0, "time_waiting_for_ai": 0 } } } Step 9: Checking blame outputs... === Blame for module1.py === 491cdda (mock_ai 2025-11-11 11:12:43 -0500 1) def function_one(): 491cdda (mock_ai 2025-11-11 11:12:43 -0500 2) print("AI generated function 1") 491cdda (mock_ai 2025-11-11 11:12:43 -0500 3) return 1 === Blame for module2.py === fb69764 (mock_ai 2025-11-11 11:12:45 -0500 1) def function_two(): fb69764 (mock_ai 2025-11-11 11:12:45 -0500 2) print("AI generated function 2") fb69764 (mock_ai 2025-11-11 11:12:45 -0500 3) return 2 fb69764 (mock_ai 2025-11-11 11:12:45 -0500 4) def helper(): fb69764 (mock_ai 2025-11-11 11:12:45 -0500 5) return "helper" =================================================================== VERIFICATION =================================================================== ✅ PASS: Commit 2 (before reset) shows ai_additions: 5 ✅ PASS: Commit 2 (after recommit) shows ai_additions: 5 ✅ PASS: module1.py shows mock_ai attribution ✅ PASS: module2.py shows mock_ai attribution =================================================================== Repository Location: /var/folders/qp/df8pj1yn36z_6hgjykzkr7_c0000gn/T/tmp.B3Ovopeq2x =================================================================== aidancunniffe@Aidans-iMac git-ai % ```
kerem 2026-03-02 04:13:19 +03:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/git-ai#328
No description provided.