diff --git a/_layouts/default.html b/_layouts/default.html index 405288d27f3a5..099b93b079cda 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -48,6 +48,7 @@

Quick start

  • Tutorials:
  • Rosetta Stone
  • Troubleshooting git
  • diff --git a/tutorial-forward-port.mdwn b/tutorial-forward-port.mdwn new file mode 100644 index 0000000000000..87d348e92024d --- /dev/null +++ b/tutorial-forward-port.mdwn @@ -0,0 +1,204 @@ +--- +title: CMS Offline Software +layout: default +related: + - { name: Project page, link: https://github.com/cms-sw/cmssw } + - { name: Topic Collector, link: https://cern.ch/cmsgit/cmsgit } + - { name: Feedback, link: https://github.com/cms-sw/cmssw/issues/new } +--- + +## Tutorial: forward porting changes. + +One of the greatest advantages of _git_ is that it is much smarter at handling +conflicts between different contribution to the same repository. In particular +it automatically handles the case of two parallel developments, both changing +the same package in orthogonal manner. As smart as it can possibly be, however, +git does not know about the mass of Higgs or how to resolve conflicts where two +people modified the same line in different ways. This latter case is however +automatically detected by github, which will point out that your changes cannot +be merged automatically. + +Tutorial will show you how to quickly resolve the latter problem. + +### Before you start. + +Please make sure you registered to GitHub and that you have provided them +a ssh public key to access your private repository. For more information see +the [FAQ](faq.html). + +We will also assume that there is a non mergeable branch called +`tutorial-unmergeable` in the repository of the user `ktf` (i.e. me :-) ) + +### Create a CMSSW area + +First of all lets create an area for the latest / greatest CMSSW available: + + > scram project CMSSW_7_0_X_2013-07-11-1400 + > cd CMSSW_7_0_X_2013-07-11-1400/src + > cmsenv + +### Try to merge a the unmergeable branch + +We then try to merge in our working area the unmergeable branch, via: + + > git cms-merge-topic ktf:tutorial-unmergeable + +this will fail with a message like: + + Auto-merging IOPool/Streamer/src/StreamerInputSource.cc + Auto-merging FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + CONFLICT (content): Merge conflict in FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + Automatic merge failed; fix conflicts and then commit the result. + Unable to merge branch tutorial-unmergeable from repository ktf. + +which means that the file `FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc` +has changed between the time `ktf:tutorial-unmergeable` was created and the +the release `CMSSW_7_0_X_2013-07-11-1400`. + +### Viewing the conflicting changes. + +The conflicting changes can be viewed by using the `git diff` command: + + > git diff + diff --cc FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + index 8a8dbe5,cb21963..0000000 + --- a/FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + +++ b/FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + @@@ -418,6 -419,7 +419,10 @@@ TFWLiteSelectorBasic::setupNewFile(TFil + edm::BranchDescription newBD(prod); + newBD.updateFriendlyClassName(); + newReg->copyProduct(newBD); + ++<<<<<<< HEAD + ++======= + + // Need to call init to get old branch name. + ++>>>>>>> ktf/tutorial-unmergeable + } + prod.init(); + } + [eulisse@lxbuild168]/build/ge/CMSSW_7_0_X_2013-07 + +As expected the file which has problems is +`FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc`. Conflicts are marked the +same way they were on CVS, via the `<<<<<<<` and `>>>>>>>` delimiters, and the +`=======`, the version on top (marked with `HEAD`) is the one which is +available in our workarea. The version on the bottom (marked with +`ktf/tutorial-unmergeable`) is the one which belong to the topic branch we are +trying to merge. In this particular case, we simply want the HEAD version (i.e. +we want to remove the comment). Therefore we do it via our preferred editor +(which is of course `vim`, but here I use nedit to make sure people don't write +me asking how to quit. + + > nedit FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + + +once we have done it, we can do _diff_ again to see the changes: + + > git diff + diff --cc FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + index 8a8dbe5,cb21963..0000000 + --- a/FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + +++ b/FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + +we can now commit our changes + + git add FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + git commit + +This will ask you to provide a comment for the conflict you just solved: + + Merged tutorial-unmergeable from repository ktf + + Conflicts: + FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + # + # It looks like you may be committing a merge. + # If this is not correct, please remove the file + # .git/MERGE_HEAD + # and try again. + +In general it's fine to leave it as it is. + +Your branch is now updated and the conflicts are solved. You can push your +changes to `my-cmssw` and update your pull request: + + git push my-cmssw tutorial-unmergeable + +### Rewriting history and cleaning up your changes + +What you have read so far is fine and you can stop reading here if the idea of +rewriting history scares you off. + +While completely correct the above mentioned procedure has the disadvantage +that an extra commit will show the fact that you had to update you branch to +keep up with an evolving release, possibly modified by someone else. You can +see this by doing `git log`: + + commit 6953bd5e73815508b9cf54bc708e5b2a25bce2cb + Merge: d3247fe f677f01 + Author: Giulio Eulisse + Date: Thu Jul 11 21:39:27 2013 +0200 + + Merged tutorial-unmergeable from repository ktf + + Conflicts: + FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + + commit f677f01460b565682f135fe6c9fee6e47b35e4dc + Author: wmtan + Date: Wed Jul 10 16:02:40 2013 -0500 + + Make BranchDescription not mutable + +Sometimes this is not desiderable, because it scatters your changes around. It +is however possible to rewrite history, and improve the look it. This is done +via the rebase command: + + > git rebase CMSSW_7_0_X_2013-07-11-1400 + +where `CMSSW_7_0_X_2013-07-11-1400` is the release you would like to align to. +This will still fail with something like: + + First, rewinding head to replay your work on top of it... + Applying: Make BranchDescription not mutable + Using index info to reconstruct a base tree... + M FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + M IOPool/Streamer/src/StreamerInputSource.cc + Falling back to patching base and 3-way merge... + Auto-merging IOPool/Streamer/src/StreamerInputSource.cc + Auto-merging FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + CONFLICT (content): Merge conflict in FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + Failed to merge in the changes. + Patch failed at 0001 Make BranchDescription not mutable + The copy of the patch that failed is found in: + /build/ge/CMSSW_7_0_X_2013-07-11-1400/src/.git/rebase-apply/patch + + When you have resolved this problem, run "git rebase --continue". + If you prefer to skip this patch, run "git rebase --skip" instead. + To check out the original branch and stop rebasing, run "git rebase --abort". + +you can then check the difference using `git diff`, fix them using your +favourite editor and stage them with: + + git add FWCore/TFWLiteSelector/src/TFWLiteSelectorBasic.cc + +and then tell git to continue to the next commit: + + git rebase --continue + +This will then get rid of the "merge commit" and your history will look much +more linear. You can now push the branch again using `git push`. + +### The dangers of rewriting history + +While there is nothing inherently bad about rewriting commit history, in +particular if it is for the sake of improving documentation and clarity of the +commit messages, it can cause havok if someone has been working on top of the +now changed head. For this reason it is raccomended that if you find yourself +using `git rebase` you also push your rewritten history to a different branch, +and create a new pull request, so that the rewritten history is easily +identified as such and people who depend on your changes do not have headaches. + +### More advanced options + +If you have multiple commits you can even rearrange those by using +the `git rebase --interactive` option.