Skip to content

Instantly share code, notes, and snippets.

@jimangel
Last active June 18, 2019 18:22
Show Gist options
  • Save jimangel/288a1a442ba52566ff825bfd828d0a00 to your computer and use it in GitHub Desktop.
Save jimangel/288a1a442ba52566ff825bfd828d0a00 to your computer and use it in GitHub Desktop.
Merge Conflict Deep Dive

Here is the process to merge master into dev-1.15. Please read the entire document before starting any work.

Start with a fresh slate

$ git clone https://github.com/jimangel/website.git website-docs
$ cd website-docs
$ git remote add upstream https://github.com/kubernetes/website.git
$ # validate
$ git remote -v
$ git fetch upstream
$ git checkout master
$ git reset --hard upstream/master  
$ git push origin master --force

Checkout dev-1.15 & merge master

$ git checkout upstream/dev-1.15
$ # merge master into it
$ git merge upstream/master

Fix merge conflicts

https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/

$ git status


Unmerged paths:
  (use "git add/rm <file>..." as appropriate to mark resolution)

	both modified:   content/en/docs/concepts/services-networking/service.md
	both modified:   content/en/docs/concepts/storage/volumes.md
	both modified:   content/en/docs/concepts/workloads/controllers/daemonset.md
	both modified:   content/en/docs/reference/command-line-tools-reference/feature-gates.md
	deleted by them: content/en/docs/reference/command-line-tools-reference/federation-apiserver.md
	both modified:   content/en/docs/reference/command-line-tools-reference/kube-apiserver.md
	both modified:   content/en/docs/reference/command-line-tools-reference/kube-controller-manager.md
	both modified:   content/en/docs/reference/command-line-tools-reference/kube-proxy.md
	both modified:   content/en/docs/reference/command-line-tools-reference/kube-scheduler.md
	both modified:   content/en/docs/reference/command-line-tools-reference/kubelet.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_certs_renew_all.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_certs_renew_apiserver-etcd-client.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_certs_renew_apiserver-kubelet-client.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_certs_renew_apiserver.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_certs_renew_etcd-healthcheck-client.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_certs_renew_etcd-peer.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_certs_renew_etcd-server.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_certs_renew_front-proxy-client.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet_config_download.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet_config_enable-dynamic.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_selfhosting_pivot.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_list.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_pull.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_migrate.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_init-defaults.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_join-defaults.md
	deleted by us:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_upload.md
	deleted by us:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_upload_from-file.md
	deleted by us:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_upload_from-flags.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_view.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_all.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_coredns.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_kube-proxy.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_bootstrap-token.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_all.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-etcd-client.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-kubelet-client.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_ca.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-ca.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-healthcheck-client.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-peer.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-server.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-ca.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-client.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_sa.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_all.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_apiserver.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_controller-manager.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_scheduler.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_etcd_local.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_admin.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_all.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_controller-manager.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_kubelet.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_scheduler.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-start.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_mark-control-plane.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_preflight.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-certs.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_all.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubeadm.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubelet.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_all.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_etcd.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_mark-control-plane.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_update-status.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_all.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_certs.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_control-plane.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_download-certs.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_kubeconfig.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_kubelet-start.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_preflight.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_create.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_delete.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_generate.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_list.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_apply.md
	deleted by us:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_config.md
	deleted by us:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_experimental-control-plane.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_plan.md
	both modified:   content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md
	both modified:   content/en/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md
	both modified:   content/en/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md
	both modified:   content/en/docs/setup/production-environment/tools/kubeadm/high-availability.md
	both modified:   content/en/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md
	both modified:   content/en/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm.md
	both modified:   content/en/docs/setup/release/version-skew-policy.md
	both modified:   content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md
	deleted by us:   content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-12.md
	deleted by us:   content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-ha-1-12.md

Decide how to address each file that conflicts

Each file, you will need to review it and, either:

After each file add it to your current commit

$ git add <recent-file-name>

Walk through example

I will address the top conflict: content/en/docs/concepts/services-networking/service.md

#(CONTINUED FROM ABOVE)
# working out of the recently merged upstream branch

# open up the offending file:
$ vi content/en/docs/concepts/services-networking/service.md

# search for "<<<<<<<"
$ /<<<<<<<

Output is similar to:

  • Top green (<<<<<< HEAD and =======) is the dev-1.15 branch
  • Bottom red (======= and >>>>>> upstream/master) is the master branch
  • The green arrow at the bottom indicates there are no other merge conflicts in this document.
  • Be sure to always check for more conflicts!
  • NOTE: Sometimes you will have to combine the two.
  • If unsure, ask #sig-docs

In this case, I will remove the upstream/master block and leave only the 1.15 addition.

# save the file
$ :wq!

# Add the file to the commit
$ git add content/en/docs/concepts/services-networking/service.md

# After adding the file, it is no longer a conflict:
$ git diff --check | grep "content/en/docs/concepts/services-networking/service.md"

# To validate this command works, let's check the next file in the above image (if it exists)
$ git diff --check | grep "content/en/docs/concepts/storage/volumes.md" 
content/en/docs/concepts/storage/volumes.md:1316: leftover conflict marker
content/en/docs/concepts/storage/volumes.md:1354: leftover conflict marker
content/en/docs/concepts/storage/volumes.md:1355: leftover conflict marker

# There's 3 conflicts in that file.

That's as far as I can go for now, without fixing all of the commits... Once every single conflict is resolved via git add <file-name> proceed to the next step.

When All files have been modified:

$ git commit -m "Resolved merge conflicts"

# You can query git for unresolved conflicts:
$ git diff --check

# You can also usually add "--dry-run" to most commands
# ex: $ git commit -m "Resolved merge conflicts" --dry-run

Push to your local fork

$ git push origin upstream/dev-1.15
# optional: git push origin upstream/dev-1.15 --dry-run

I can't recall after this step, I believe you would push this commit to your local fork (as upstream/dev-1.15) and then PR your upstream/dev-1.15 to theirs. Your "mega branch" kubernetes/website#14176 would then pick up this change (resolving the conflicts).

Please provide feedback at this step. One thing to look out for, is, we might need to create a local branch for you to resolve the conflicts and then PR.

@zacharysarah
Copy link

❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment