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?!?!
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.
“
”
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

What's hot

GitHub Actions with Node.js
GitHub Actions with Node.jsGitHub Actions with Node.js
GitHub Actions with Node.js
Stefan Stölzle
 
DockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようDockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみよう
mookjp
 
Git vs svn
Git vs svnGit vs svn
Git vs svn
Suman Mukherjee
 
Comparing Next-Generation Container Image Building Tools
 Comparing Next-Generation Container Image Building Tools Comparing Next-Generation Container Image Building Tools
Comparing Next-Generation Container Image Building Tools
Akihiro Suda
 
Kubernetes Basics
Kubernetes BasicsKubernetes Basics
Kubernetes Basics
Antonin Stoklasek
 
Introduction to kubernetes
Introduction to kubernetesIntroduction to kubernetes
Introduction to kubernetes
Gabriel Carro
 
Designing a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd productsDesigning a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd products
Julian Mazzitelli
 
Deep Dive into Building a Secure & Multi-tenant SaaS Solution with NATS
Deep Dive into Building a Secure & Multi-tenant SaaS Solution with NATSDeep Dive into Building a Secure & Multi-tenant SaaS Solution with NATS
Deep Dive into Building a Secure & Multi-tenant SaaS Solution with NATS
NATS
 
Introduction git
Introduction gitIntroduction git
Introduction git
Dian Sigit Prastowo
 
Git Tutorial I
Git Tutorial IGit Tutorial I
Git Tutorial I
Jim Yeh
 
GitHub Actions in action
GitHub Actions in actionGitHub Actions in action
GitHub Actions in action
Oleksii Holub
 
Git101
Git101Git101
Git101
Jason Noble
 
Gitops: the kubernetes way
Gitops: the kubernetes wayGitops: the kubernetes way
Gitops: the kubernetes way
sparkfabrik
 
Kubernetes GitOps featuring GitHub, Kustomize and ArgoCD
Kubernetes GitOps featuring GitHub, Kustomize and ArgoCDKubernetes GitOps featuring GitHub, Kustomize and ArgoCD
Kubernetes GitOps featuring GitHub, Kustomize and ArgoCD
Sunnyvale
 
Kuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOpsKuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOps
shunki fujiwara
 
Introduction to git
Introduction to gitIntroduction to git
Introduction to git
Randal Schwartz
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to GitlabJulien Pivotto
 
CKA Certified Kubernetes Administrator Notes
CKA Certified Kubernetes Administrator Notes CKA Certified Kubernetes Administrator Notes
CKA Certified Kubernetes Administrator Notes
Adnan Rashid
 

What's hot (20)

GitHub Actions with Node.js
GitHub Actions with Node.jsGitHub Actions with Node.js
GitHub Actions with Node.js
 
DockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようDockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみよう
 
Git vs svn
Git vs svnGit vs svn
Git vs svn
 
Comparing Next-Generation Container Image Building Tools
 Comparing Next-Generation Container Image Building Tools Comparing Next-Generation Container Image Building Tools
Comparing Next-Generation Container Image Building Tools
 
Kubernetes Basics
Kubernetes BasicsKubernetes Basics
Kubernetes Basics
 
Introduction to kubernetes
Introduction to kubernetesIntroduction to kubernetes
Introduction to kubernetes
 
Designing a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd productsDesigning a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd products
 
Deep Dive into Building a Secure & Multi-tenant SaaS Solution with NATS
Deep Dive into Building a Secure & Multi-tenant SaaS Solution with NATSDeep Dive into Building a Secure & Multi-tenant SaaS Solution with NATS
Deep Dive into Building a Secure & Multi-tenant SaaS Solution with NATS
 
Introduction git
Introduction gitIntroduction git
Introduction git
 
Git Tutorial I
Git Tutorial IGit Tutorial I
Git Tutorial I
 
GitHub Actions in action
GitHub Actions in actionGitHub Actions in action
GitHub Actions in action
 
mTCP使ってみた
mTCP使ってみたmTCP使ってみた
mTCP使ってみた
 
Git101
Git101Git101
Git101
 
Gitops: the kubernetes way
Gitops: the kubernetes wayGitops: the kubernetes way
Gitops: the kubernetes way
 
Git real slides
Git real slidesGit real slides
Git real slides
 
Kubernetes GitOps featuring GitHub, Kustomize and ArgoCD
Kubernetes GitOps featuring GitHub, Kustomize and ArgoCDKubernetes GitOps featuring GitHub, Kustomize and ArgoCD
Kubernetes GitOps featuring GitHub, Kustomize and ArgoCD
 
Kuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOpsKuberneteの運用を支えるGitOps
Kuberneteの運用を支えるGitOps
 
Introduction to git
Introduction to gitIntroduction to git
Introduction to git
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to Gitlab
 
CKA Certified Kubernetes Administrator Notes
CKA Certified Kubernetes Administrator Notes CKA Certified Kubernetes Administrator Notes
CKA Certified Kubernetes Administrator Notes
 

Viewers also liked

Cregit Recovering token level authorship from Git
Cregit Recovering token level authorship from GitCregit Recovering token level authorship from Git
Cregit Recovering token level authorship from Git
dmgerman
 
Abdominal CT scan
Abdominal CT scanAbdominal CT scan
Abdominal CT scan
ALAUF JALALUDEEN
 
Anatomy abdomen and pelvis
Anatomy abdomen and pelvis Anatomy abdomen and pelvis
Anatomy abdomen and pelvis
Medvizz institute of medical education
 
CT ABDOMEN ANATOMY
 CT ABDOMEN ANATOMY CT ABDOMEN ANATOMY
CT ABDOMEN ANATOMY
Sakher Alkhaderi
 
Anatomy 210 abdomen & pelvis for semester ii year 2012-2013
Anatomy 210 abdomen & pelvis   for semester ii year 2012-2013Anatomy 210 abdomen & pelvis   for semester ii year 2012-2013
Anatomy 210 abdomen & pelvis for semester ii year 2012-2013AHS_anatomy2
 
Cross Sectional Anatomy Of The Abdomen Annotated
Cross Sectional Anatomy Of The Abdomen AnnotatedCross Sectional Anatomy Of The Abdomen Annotated
Cross Sectional Anatomy Of The Abdomen AnnotatedDebby Edney
 
Nmt 405 abdomen and pelvis ppt
Nmt 405 abdomen and pelvis pptNmt 405 abdomen and pelvis ppt
Nmt 405 abdomen and pelvis pptClassyCJ
 
BASICS of CT Head
BASICS of CT HeadBASICS of CT Head
BASICS of CT Head
Kunal Mahajan
 
Presentation1.pptx, radiological anatomy of the abdomen and pelvis.
Presentation1.pptx, radiological anatomy of the abdomen and pelvis.Presentation1.pptx, radiological anatomy of the abdomen and pelvis.
Presentation1.pptx, radiological anatomy of the abdomen and pelvis.Abdellah Nazeer
 
CT Anatomy
CT AnatomyCT Anatomy
CT Anatomy
Selva Kumar
 

Viewers also liked (10)

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

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

Transformative Git Practices
Transformative Git PracticesTransformative Git Practices
Transformative Git Practices
Nicola Paolucci
 
Git introduction
Git introductionGit introduction
Git introduction
satyendrajaladi
 
Git from the trenches
Git from the trenchesGit from the trenches
Git from the trenches
Nuno Caneco
 
Collaborative development with Git | Workshop
Collaborative development with Git | WorkshopCollaborative development with Git | Workshop
Collaborative development with Git | Workshop
Anuchit Chalothorn
 
Git Commands Every Developer Should Know?
Git Commands Every Developer Should Know?Git Commands Every Developer Should Know?
Git Commands Every Developer Should Know?
9 series
 
SVN 2 Git
SVN 2 GitSVN 2 Git
SVN 2 Git
Marco De Stefano
 
Introduction to Git
Introduction to GitIntroduction to Git
Introduction to Git
Jose Emilio Labra Gayo
 
Take the next step with git
Take the next step with gitTake the next step with git
Take the next step with git
Karin Taliga
 
Git for developers
Git for developersGit for developers
Git for developers
Hacen Dadda
 
Git cheat sheet
Git cheat sheetGit cheat sheet
Git cheat sheet
Lam Hoang
 
Git basics
Git basicsGit basics
Git basics
GHARSALLAH Mohamed
 
Git slides
Git slidesGit slides
Git slides
Nanyak S
 
Git basics with notes
Git basics with notesGit basics with notes
Git basics with notes
Surabhi Gupta
 
Version control git day03
Version control   git day03Version control   git day03
Version control git day03
Gourav Varma
 
GitHub Event.pptx
GitHub Event.pptxGitHub Event.pptx
GitHub Event.pptx
KeerthanaJ32
 
Honestly Git Playground 20190221
Honestly Git Playground 20190221Honestly Git Playground 20190221
Honestly Git Playground 20190221
Shinho Kang
 
Rc094 010d-git 2 - desconocido
Rc094 010d-git 2 - desconocidoRc094 010d-git 2 - desconocido
Rc094 010d-git 2 - desconocidoLuis Bertel
 
Git more done
Git more doneGit more done
Git more done
Kwen Peterson
 
Introduction to Git for Artists
Introduction to Git for ArtistsIntroduction to Git for Artists
Introduction to Git for Artists
David Newbury
 

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

Transformative Git Practices
Transformative Git PracticesTransformative Git Practices
Transformative Git Practices
 
Git introduction
Git introductionGit introduction
Git introduction
 
Git training
Git trainingGit training
Git training
 
Git from the trenches
Git from the trenchesGit from the trenches
Git from the trenches
 
Collaborative development with Git | Workshop
Collaborative development with Git | WorkshopCollaborative development with Git | Workshop
Collaborative development with Git | Workshop
 
Git Commands Every Developer Should Know?
Git Commands Every Developer Should Know?Git Commands Every Developer Should Know?
Git Commands Every Developer Should Know?
 
SVN 2 Git
SVN 2 GitSVN 2 Git
SVN 2 Git
 
Introduction to Git
Introduction to GitIntroduction to Git
Introduction to Git
 
Take the next step with git
Take the next step with gitTake the next step with git
Take the next step with git
 
Git for developers
Git for developersGit for developers
Git for developers
 
Git cheat sheet
Git cheat sheetGit cheat sheet
Git cheat sheet
 
Git basics
Git basicsGit basics
Git basics
 
Git slides
Git slidesGit slides
Git slides
 
Git basics with notes
Git basics with notesGit basics with notes
Git basics with notes
 
Version control git day03
Version control   git day03Version control   git day03
Version control git day03
 
GitHub Event.pptx
GitHub Event.pptxGitHub Event.pptx
GitHub Event.pptx
 
Honestly Git Playground 20190221
Honestly Git Playground 20190221Honestly Git Playground 20190221
Honestly Git Playground 20190221
 
Rc094 010d-git 2 - desconocido
Rc094 010d-git 2 - desconocidoRc094 010d-git 2 - desconocido
Rc094 010d-git 2 - desconocido
 
Git more done
Git more doneGit more done
Git more done
 
Introduction to Git for Artists
Introduction to Git for ArtistsIntroduction to Git for Artists
Introduction to Git for Artists
 

More from Atlassian

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

More from Atlassian (20)

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

Recently uploaded

GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
Globus
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Mind IT Systems
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
Donna Lenk
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
Georgi Kodinov
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
Juraj Vysvader
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
IES VE
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Globus
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 

Recently uploaded (20)

GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 

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?!?!
  • 29.
  • 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. “ ”
  • 31.
  • 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