SlideShare a Scribd company logo
NICOLA PAOLUCCI • DEVELOPER INSTIGATOR • ATLASSIAN • @DURDN
Advanced Git Techniques
Subtrees, grafting and other fun
Get more out of your
version control.
Today we’ll cover some powerful Git goodies
Interactive stagingPainless sub-projects Collating history
Interactive commits are
an amazing tool at your
disposal as you work on
complex code changes
You can use git
subtree to handle
external libraries in a
clean and efficient way
Joining together history
of your projects using
git replace is useful
when migrating to Git
git subtree
Extract project
Alternative to git submodule to handle
external dependencies.
Inject dependency
It allows you to inject an external
project into a sub-folder
Introduced in 1.7.11
It can be also used to extract a
sub-folder as separate project
Clean integration pointsStores in regular commitsNo training
When and why is git subtree a great choice
Does not require your
entire team to be
trained in the use of the
command
The command stores
the external
dependency in regular
Git commits. Squashing
the history optionally.
It makes it easy to see
when integrations
happened and makes it
easy to revert them.
Syntax to inject a project
Command to inject project
git subtree add 
--prefix target-folder 
https://bitbucket.org/team/sub.git 
master --squash
Folder where to insert code
Repository URL
v1.1
Under the hood of git subtree
commit ab54c4e0b75c3107e3e773ab9b39268abddca002
Author: Nicola Paolucci <npaolucci@atlassian.com>
Date: Tue Sep 29 15:27:35 2015 +0200
Squashed ‘src/sub-project‘ content from commit df563ed
git-subtree-dir: src/sub-project
git-subtree-split: df563ed15fa6…6b2e95d3
Result of git subtree add
commit 8fb507baf7b270c30c822b27e262d0b44819b4c5
Merge: 606cd3e ab54c4e
Author: Nicola Paolucci <npaolucci@atlassian.com>
Date: Tue Sep 29 15:27:35 2015 +0200
Merge commit 'ab54c4e0b75c3107e3e773ab9b39268abddca002' as '.vim/bundle/fireplace'
commit ab54c4e0b75c3107e3e773ab9b39268abddca002
Author: Nicola Paolucci <npaolucci@atlassian.com>
Date: Tue Sep 29 15:27:35 2015 +0200
Squashed '.vim/bundle/fireplace/' content from commit df563ed
git-subtree-dir: .vim/bundle/fireplace
git-subtree-split: df563ed15fa685ce2508bf16b3ca7e176b2e95d3
To keep the sub-project up to date
git subtree pull 
--prefix target-folder 
https://bitbucket.org/team/sub.git 
master --squash
Command to pull project
Folder where to insert code
Repository URL
v1.5
Under the hood of git subtree
commit ab54c4e0b75c3107e3e773ab9b39268abddca002
Author: Nicola Paolucci <npaolucci@atlassian.com>
Date: Tue Sep 29 15:27:35 2015 +0200
Squashed ‘src/sub-project‘ content from commit df563ed
git-subtree-dir: src/sub-project
git-subtree-split: df563ed15fa6…6b2e95d3
Find the symbolic ref matching a hash (sha-1)
sha-1 of last commit pulled
Git plumbing to list all remote refs
Repository URL
git ls-remote https://bitbucket.org/team/sub.git | grep df563ed
df563ed15fa685ce2508bf16b3ca7e176b2e95d3 v1.1
5eaff1232acedeca565er7e1333234dacccebfff v1.5
git ls-remote https://bitbucket.org/team/sub.git | grep <sha-1>
Aliases to make your life easier!
[alias]
sba = "!f() { git subtree add --prefix $2 $1 master --squash; }; f"
sbu = "!f() { git subtree pull --prefix $2 $1 master --squash; }; f"
Alias section of your .gitconfig
http://bit.do/git-aliases
How to use the aliases
git sba <repo URL> <destination-folder>
git sba https://bitbucket.org/team/sub.git src/sub
When everyone in the
team must work on
sub-projects
When you have
constant updates to
your dependencies
When you have many
dependencies
When NOT to use git subtree
For complex project dependencies
Use a dependency tool.
Really.
Alternatives?
Read my rant
on project
dependencies
http://bit.do/git-dep
How to extract a project
Let’s learn how to use subtree split
Git subtree to extract a project
Command to split out project
git subtree split 
--prefix my/project/ 
--branch extracted
Folder prefix to extract
where we store it
Push to new remote
We can remove the contents of the
folder from the repo
Import extracted branch
Initialise a new repo and import the
extracted branch
Remove from old repo
After we imported the code we can
push it to a new repository
git rm -rf my/project
git init
git pull ../path/ extracted
git remote add origin …
git push origin -u master
Interactive commit
Splitting commits semantically in flight!
Fine grained control on
your commits
Knowing this technique
frees you from worrying
about what to do first
Atomic commits make
your changes readable
Why split changes interactively?
We modify a single file (README) in 3 parts
# Title
Content of my article
## Subtitle second heading
Some more paragraph content
## Conclusions
We modify a single file in 3 different parts
[:~/p/demo] master(+3/-0) ± git diff
@@ -1,11 +1,14 @@
# Title
Content of my article
+Adding a second line to Title.
## Subtitle second heading
Some more paragraph content
+Adding another line to Subtitle 1
## Conclusions
Here are your conclusions
To split those changes in separate commits:
git commit --interactive
staged unstaged path
1: unchanged +3/-0 README.md
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>
Overview of
interactive
staging
revert
The status of the files, whether they
are staged or unstaged.
update
Choose which files to add to the
staging area
status
Undo any action done previously in
this session.
Overview of
interactive
staging [2]
add untracked
Check the unstaged or staged
changes in the workspace.
patch
Add parts of a file to the staging area.
This allows you to split commits.
diff
Add new untracked files to the
repository.
I finally hit “p” for patch, select the file and ENTER:
What now> p
staged unstaged path
1: unchanged +3/-0 README.md
Patch update>> 1
staged unstaged path
* 1: unchanged +3/-0 README.md
Patch update>>
I finally hit “p” for patch, select the file and ENTER:
@@ -1,11 +1,14 @@
# Title
Content of my article
+Adding a second line to Title.
## Subtitle second heading
Some more paragraph content
+Adding another line to Subtitle 1
## Conclusions
Here are your conclusions
+Adding to the Conclusions.
Stage this
hunk?!?!
Advanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
A hunk is just a piece of text in a larger file.
Diff and patch commands tend to understand
changes by clustering them in blocks of
continuous text.
“
”
Advanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
If the default hunk size is too big, you can split it:
Stage this hunk [y,n,q,a,d,/,s,e,?]? s
Split into 3 hunks.
@@ -1,7 +1,8 @@
# Title
Content of my article
+Adding a second line to Title.
## Subtitle second heading
Some more paragraph content
Let’s stage this hunk, or add it to the staging area:
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? y
@@ -4,8 +5,9 @@
## Subtitle second heading
Some more paragraph content
+Adding another line to Subtitle 1
## Conclusions
Here are your conclusions
Stage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]?
Now so skip all the rest pressing “q” twice:
The result is a neat new commit and the rest left:
14a0be4 [4 minutes ago] (HEAD -> master) Add content to Title [Nick]
git diff
diff --git i/README.md w/README.md
index fc26295..0ef85c4 100644
--- i/README.md
+++ w/README.md
@@ -6,7 +6,9 @@ Adding a second line to Title.
## Subtitle second heading
Some more paragraph content
+Adding another line to Subtitle 1
## Conclusions
When you need help just press “?”
Stage this hunk [y,n,q,a,d,/,s,e,?]? ?
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
Collating History
Cross VCS mergesUnify two reposFast migration from svn
Why collate history?
Migrate immediately
from Subversion, attach
the earlier history after
the migration.
You have two
repositories that should
actually be only one.
You need to perform
Subversion merges in a
Git branch
One relevant
example:
Linux kernel
Today use git replace
The entire history of the Linux kernel
is split over three different repos.
Originally in Grafts
Which are local pair of ids connecting
a commit id (SHA-1) to the next
Linux kernel is split
Available in the stock git distribution
since version 1.6.5
git replace is capable to replace any object
with any other object.
It tracks these swaps via refs which you can
push and pull between repositories.
“
”
git replace in practice
shallow
first
last
legacy
shallow clone with cut history
git replace first last
First commit of restarted repo
git checkout -b shallow origin/shallow
git log --max-parents=0 master
git tag 56eacf first -m”Tag… commit”
shallow
first
Last commit of legacy repo
git checkout -b legacy origin/legacy
git rev-parse --verify legacy
git tag 84abb last -m”Tag… commit”
last
legacy
git replace in practice
shallow
first
last
legacy
shallow clone with cut history
git replace first last
Replacements are persisted
cat .git/refs/replace/56eac…7cc
84abb39d9aab234dfba2e41f13f693fa5edbfe22
git push origin ‘refs/replace/*’
If you want to make the git replace changes
permanent and free the team from pulling
those refs, do a final pass using
git filter-branch
“
”
Go forth and enrich your
Git experience
Thank you!
NICOLA PAOLUCCI • DEVELOPER INSTIGATOR • ATLASSIAN • @DURDN
Twitter: @durdn
• GIF backdrops taken from giphy.com
• Icons from thenounproject.com credits below
Image credits

More Related Content

PPTX
Git - Basic Crash Course
PDF
Introduction to Github Actions
PDF
Introduction to GitHub Actions
PDF
Introduction to GitHub Actions
PPTX
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
PDF
git and github
PDF
Git - An Introduction
PPTX
CICD Pipeline Using Github Actions
Git - Basic Crash Course
Introduction to Github Actions
Introduction to GitHub Actions
Introduction to GitHub Actions
Git Tutorial For Beginners | What is Git and GitHub? | DevOps Tools | DevOps ...
git and github
Git - An Introduction
CICD Pipeline Using Github Actions

What's hot (20)

PDF
Git and git flow
PPTX
Jenkins CI
PDF
Github - Git Training Slides: Foundations
PPTX
Git & GitLab
PDF
Git and github 101
PDF
Git training v10
PDF
Git for beginners
PPTX
Git One Day Training Notes
PPSX
PPTX
Using Git and BitBucket
PPTX
GIT presentation
PPTX
Container based CI/CD on GitHub Actions
PDF
Jenkins Pipelines
PPTX
Github in Action
PDF
Effective testing with pytest
PDF
Learning git
PPTX
Introduction git
PPTX
PDF
github-actions.pdf
Git and git flow
Jenkins CI
Github - Git Training Slides: Foundations
Git & GitLab
Git and github 101
Git training v10
Git for beginners
Git One Day Training Notes
Using Git and BitBucket
GIT presentation
Container based CI/CD on GitHub Actions
Jenkins Pipelines
Github in Action
Effective testing with pytest
Learning git
Introduction git
github-actions.pdf
Ad

Viewers also liked (10)

PDF
Cregit Recovering token level authorship from Git
PPTX
Abdominal CT scan
PPT
Anatomy abdomen and pelvis
PPTX
CT ABDOMEN ANATOMY
PPTX
Anatomy 210 abdomen & pelvis for semester ii year 2012-2013
PPT
Cross Sectional Anatomy Of The Abdomen Annotated
PPT
Nmt 405 abdomen and pelvis ppt
PPTX
BASICS of CT Head
PPTX
Presentation1.pptx, radiological anatomy of the abdomen and pelvis.
PPT
CT Anatomy
Cregit Recovering token level authorship from Git
Abdominal CT scan
Anatomy abdomen and pelvis
CT ABDOMEN ANATOMY
Anatomy 210 abdomen & pelvis for semester ii year 2012-2013
Cross Sectional Anatomy Of The Abdomen Annotated
Nmt 405 abdomen and pelvis ppt
BASICS of CT Head
Presentation1.pptx, radiological anatomy of the abdomen and pelvis.
CT Anatomy
Ad

Similar to Advanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff (20)

PDF
Transformative Git Practices
PDF
Git training
PPTX
Git from the trenches
PDF
Collaborative development with Git | Workshop
PDF
Git Commands Every Developer Should Know?
PDF
SVN 2 Git
PPTX
Introduction to Git
PDF
Take the next step with git
PDF
Git for developers
PDF
Git cheat sheet
PDF
Git basics
PDF
Git slides
PDF
Git basics with notes
PPTX
Version control git day03
PPTX
GitHub Event.pptx
PDF
Honestly Git Playground 20190221
PDF
Rc094 010d-git 2 - desconocido
PPTX
Git more done
PDF
Introduction to Git for Artists
PPTX
Git training (basic)
Transformative Git Practices
Git training
Git from the trenches
Collaborative development with Git | Workshop
Git Commands Every Developer Should Know?
SVN 2 Git
Introduction to Git
Take the next step with git
Git for developers
Git cheat sheet
Git basics
Git slides
Git basics with notes
Version control git day03
GitHub Event.pptx
Honestly Git Playground 20190221
Rc094 010d-git 2 - desconocido
Git more done
Introduction to Git for Artists
Git training (basic)

More from Atlassian (20)

PPTX
International Women's Day 2020
PDF
10 emerging trends that will unbreak your workplace in 2020
PDF
Forge App Showcase
PDF
Let's Build an Editor Macro with Forge UI
PDF
Meet the Forge Runtime
PDF
Forge UI: A New Way to Customize the Atlassian User Experience
PDF
Take Action with Forge Triggers
PDF
Observability and Troubleshooting in Forge
PDF
Trusted by Default: The Forge Security & Privacy Model
PDF
Designing Forge UI: A Story of Designing an App UI System
PDF
Forge: Under the Hood
PDF
Access to User Activities - Activity Platform APIs
PDF
Design Your Next App with the Atlassian Vendor Sketch Plugin
PDF
Tear Up Your Roadmap and Get Out of the Building
PDF
Nailing Measurement: a Framework for Measuring Metrics that Matter
PDF
Building Apps With Color Blind Users in Mind
PDF
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
PDF
Beyond Diversity: A Guide to Building Balanced Teams
PDF
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
PDF
Building Apps With Enterprise in Mind
International Women's Day 2020
10 emerging trends that will unbreak your workplace in 2020
Forge App Showcase
Let's Build an Editor Macro with Forge UI
Meet the Forge Runtime
Forge UI: A New Way to Customize the Atlassian User Experience
Take Action with Forge Triggers
Observability and Troubleshooting in Forge
Trusted by Default: The Forge Security & Privacy Model
Designing Forge UI: A Story of Designing an App UI System
Forge: Under the Hood
Access to User Activities - Activity Platform APIs
Design Your Next App with the Atlassian Vendor Sketch Plugin
Tear Up Your Roadmap and Get Out of the Building
Nailing Measurement: a Framework for Measuring Metrics that Matter
Building Apps With Color Blind Users in Mind
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
Beyond Diversity: A Guide to Building Balanced Teams
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
Building Apps With Enterprise in Mind

Recently uploaded (20)

PPTX
L1 - Introduction to python Backend.pptx
PPTX
ai tools demonstartion for schools and inter college
PPTX
Transform Your Business with a Software ERP System
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
System and Network Administraation Chapter 3
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PPTX
ISO 45001 Occupational Health and Safety Management System
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Understanding Forklifts - TECH EHS Solution
PDF
top salesforce developer skills in 2025.pdf
L1 - Introduction to python Backend.pptx
ai tools demonstartion for schools and inter college
Transform Your Business with a Software ERP System
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
Design an Analysis of Algorithms II-SECS-1021-03
System and Network Administraation Chapter 3
PTS Company Brochure 2025 (1).pdf.......
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
2025 Textile ERP Trends: SAP, Odoo & Oracle
ISO 45001 Occupational Health and Safety Management System
ManageIQ - Sprint 268 Review - Slide Deck
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Adobe Illustrator 28.6 Crack My Vision of Vector Design
How Creative Agencies Leverage Project Management Software.pdf
Understanding Forklifts - TECH EHS Solution
top salesforce developer skills in 2025.pdf

Advanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff

  • 1. NICOLA PAOLUCCI • DEVELOPER INSTIGATOR • ATLASSIAN • @DURDN Advanced Git Techniques Subtrees, grafting and other fun
  • 2. Get more out of your version control.
  • 3. Today we’ll cover some powerful Git goodies Interactive stagingPainless sub-projects Collating history Interactive commits are an amazing tool at your disposal as you work on complex code changes You can use git subtree to handle external libraries in a clean and efficient way Joining together history of your projects using git replace is useful when migrating to Git
  • 4. git subtree Extract project Alternative to git submodule to handle external dependencies. Inject dependency It allows you to inject an external project into a sub-folder Introduced in 1.7.11 It can be also used to extract a sub-folder as separate project
  • 5. Clean integration pointsStores in regular commitsNo training When and why is git subtree a great choice Does not require your entire team to be trained in the use of the command The command stores the external dependency in regular Git commits. Squashing the history optionally. It makes it easy to see when integrations happened and makes it easy to revert them.
  • 6. Syntax to inject a project Command to inject project git subtree add --prefix target-folder https://bitbucket.org/team/sub.git master --squash Folder where to insert code Repository URL v1.1
  • 7. Under the hood of git subtree commit ab54c4e0b75c3107e3e773ab9b39268abddca002 Author: Nicola Paolucci <npaolucci@atlassian.com> Date: Tue Sep 29 15:27:35 2015 +0200 Squashed ‘src/sub-project‘ content from commit df563ed git-subtree-dir: src/sub-project git-subtree-split: df563ed15fa6…6b2e95d3
  • 8. Result of git subtree add commit 8fb507baf7b270c30c822b27e262d0b44819b4c5 Merge: 606cd3e ab54c4e Author: Nicola Paolucci <npaolucci@atlassian.com> Date: Tue Sep 29 15:27:35 2015 +0200 Merge commit 'ab54c4e0b75c3107e3e773ab9b39268abddca002' as '.vim/bundle/fireplace' commit ab54c4e0b75c3107e3e773ab9b39268abddca002 Author: Nicola Paolucci <npaolucci@atlassian.com> Date: Tue Sep 29 15:27:35 2015 +0200 Squashed '.vim/bundle/fireplace/' content from commit df563ed git-subtree-dir: .vim/bundle/fireplace git-subtree-split: df563ed15fa685ce2508bf16b3ca7e176b2e95d3
  • 9. To keep the sub-project up to date git subtree pull --prefix target-folder https://bitbucket.org/team/sub.git master --squash Command to pull project Folder where to insert code Repository URL v1.5
  • 10. Under the hood of git subtree commit ab54c4e0b75c3107e3e773ab9b39268abddca002 Author: Nicola Paolucci <npaolucci@atlassian.com> Date: Tue Sep 29 15:27:35 2015 +0200 Squashed ‘src/sub-project‘ content from commit df563ed git-subtree-dir: src/sub-project git-subtree-split: df563ed15fa6…6b2e95d3
  • 11. Find the symbolic ref matching a hash (sha-1) sha-1 of last commit pulled Git plumbing to list all remote refs Repository URL git ls-remote https://bitbucket.org/team/sub.git | grep df563ed df563ed15fa685ce2508bf16b3ca7e176b2e95d3 v1.1 5eaff1232acedeca565er7e1333234dacccebfff v1.5 git ls-remote https://bitbucket.org/team/sub.git | grep <sha-1>
  • 12. Aliases to make your life easier! [alias] sba = "!f() { git subtree add --prefix $2 $1 master --squash; }; f" sbu = "!f() { git subtree pull --prefix $2 $1 master --squash; }; f" Alias section of your .gitconfig http://bit.do/git-aliases
  • 13. How to use the aliases git sba <repo URL> <destination-folder> git sba https://bitbucket.org/team/sub.git src/sub
  • 14. When everyone in the team must work on sub-projects When you have constant updates to your dependencies When you have many dependencies When NOT to use git subtree
  • 15. For complex project dependencies Use a dependency tool. Really.
  • 16. Alternatives? Read my rant on project dependencies http://bit.do/git-dep
  • 17. How to extract a project Let’s learn how to use subtree split
  • 18. Git subtree to extract a project Command to split out project git subtree split --prefix my/project/ --branch extracted Folder prefix to extract where we store it
  • 19. Push to new remote We can remove the contents of the folder from the repo Import extracted branch Initialise a new repo and import the extracted branch Remove from old repo After we imported the code we can push it to a new repository git rm -rf my/project git init git pull ../path/ extracted git remote add origin … git push origin -u master
  • 20. Interactive commit Splitting commits semantically in flight!
  • 21. Fine grained control on your commits Knowing this technique frees you from worrying about what to do first Atomic commits make your changes readable Why split changes interactively?
  • 22. We modify a single file (README) in 3 parts # Title Content of my article ## Subtitle second heading Some more paragraph content ## Conclusions
  • 23. We modify a single file in 3 different parts [:~/p/demo] master(+3/-0) ± git diff @@ -1,11 +1,14 @@ # Title Content of my article +Adding a second line to Title. ## Subtitle second heading Some more paragraph content +Adding another line to Subtitle 1 ## Conclusions Here are your conclusions
  • 24. To split those changes in separate commits: git commit --interactive staged unstaged path 1: unchanged +3/-0 README.md *** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now>
  • 25. Overview of interactive staging revert The status of the files, whether they are staged or unstaged. update Choose which files to add to the staging area status Undo any action done previously in this session.
  • 26. Overview of interactive staging [2] add untracked Check the unstaged or staged changes in the workspace. patch Add parts of a file to the staging area. This allows you to split commits. diff Add new untracked files to the repository.
  • 27. I finally hit “p” for patch, select the file and ENTER: What now> p staged unstaged path 1: unchanged +3/-0 README.md Patch update>> 1 staged unstaged path * 1: unchanged +3/-0 README.md Patch update>>
  • 28. I finally hit “p” for patch, select the file and ENTER: @@ -1,11 +1,14 @@ # Title Content of my article +Adding a second line to Title. ## Subtitle second heading Some more paragraph content +Adding another line to Subtitle 1 ## Conclusions Here are your conclusions +Adding to the Conclusions. Stage this hunk?!?!
  • 30. A hunk is just a piece of text in a larger file. Diff and patch commands tend to understand changes by clustering them in blocks of continuous text. “ ”
  • 32. If the default hunk size is too big, you can split it: Stage this hunk [y,n,q,a,d,/,s,e,?]? s Split into 3 hunks. @@ -1,7 +1,8 @@ # Title Content of my article +Adding a second line to Title. ## Subtitle second heading Some more paragraph content
  • 33. Let’s stage this hunk, or add it to the staging area: Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? y @@ -4,8 +5,9 @@ ## Subtitle second heading Some more paragraph content +Adding another line to Subtitle 1 ## Conclusions Here are your conclusions Stage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]?
  • 34. Now so skip all the rest pressing “q” twice:
  • 35. The result is a neat new commit and the rest left: 14a0be4 [4 minutes ago] (HEAD -> master) Add content to Title [Nick] git diff diff --git i/README.md w/README.md index fc26295..0ef85c4 100644 --- i/README.md +++ w/README.md @@ -6,7 +6,9 @@ Adding a second line to Title. ## Subtitle second heading Some more paragraph content +Adding another line to Subtitle 1 ## Conclusions
  • 36. When you need help just press “?” Stage this hunk [y,n,q,a,d,/,s,e,?]? ? y - stage this hunk n - do not stage this hunk q - quit; do not stage this hunk or any of the remaining ones a - stage this hunk and all later hunks in the file d - do not stage this hunk or any later hunks in the file g - select a hunk to go to / - search for a hunk matching the given regex j - leave this hunk undecided, see next undecided hunk J - leave this hunk undecided, see next hunk k - leave this hunk undecided, see previous undecided hunk K - leave this hunk undecided, see previous hunk s - split the current hunk into smaller hunks e - manually edit the current hunk
  • 38. Cross VCS mergesUnify two reposFast migration from svn Why collate history? Migrate immediately from Subversion, attach the earlier history after the migration. You have two repositories that should actually be only one. You need to perform Subversion merges in a Git branch
  • 39. One relevant example: Linux kernel Today use git replace The entire history of the Linux kernel is split over three different repos. Originally in Grafts Which are local pair of ids connecting a commit id (SHA-1) to the next Linux kernel is split Available in the stock git distribution since version 1.6.5
  • 40. git replace is capable to replace any object with any other object. It tracks these swaps via refs which you can push and pull between repositories. “ ”
  • 41. git replace in practice shallow first last legacy shallow clone with cut history git replace first last
  • 42. First commit of restarted repo git checkout -b shallow origin/shallow git log --max-parents=0 master git tag 56eacf first -m”Tag… commit” shallow first
  • 43. Last commit of legacy repo git checkout -b legacy origin/legacy git rev-parse --verify legacy git tag 84abb last -m”Tag… commit” last legacy
  • 44. git replace in practice shallow first last legacy shallow clone with cut history git replace first last
  • 45. Replacements are persisted cat .git/refs/replace/56eac…7cc 84abb39d9aab234dfba2e41f13f693fa5edbfe22 git push origin ‘refs/replace/*’
  • 46. If you want to make the git replace changes permanent and free the team from pulling those refs, do a final pass using git filter-branch “ ”
  • 47. Go forth and enrich your Git experience
  • 48. Thank you! NICOLA PAOLUCCI • DEVELOPER INSTIGATOR • ATLASSIAN • @DURDN Twitter: @durdn
  • 49. • GIF backdrops taken from giphy.com • Icons from thenounproject.com credits below Image credits