<div dir="ltr">As a person who uses git almost exclusively, your workflow is needlessly confusing<div><br></div><div>You should almost never push to your GitHub master unless you are updating from upstream or it's your own project and you are developing it</div><div><br></div><div>I am excluding commands relating to archaist since I don't understand it and can't figure out how to use Phabricator at all.</div><div>I will use `upstream` to represent the llvm-project remote (<a href="https://github.com/llvm/llvm-project.git">https://github.com/llvm/llvm-project.git</a>), and `origin` to represent my personal fork</div><div><br></div><div>``` bash</div><div>git fetch --all -pf</div><div># Make sure you have updated all of remote branches</div><div><br></div><div>git checkout patchbranch</div><div>git checkout -b tmp</div><div>git rebase -i $(git merge-base HEAD upstream/master)</div><div># Runs a rebase on from the commit you branched off that exists in the master branch of llvm. This should be clean as it would only apply changes you have made since you last checked from master</div><div># An editor should open and you can replace all of the `pick`s after the first commit with either `fixup` if you don't care about what message you had, `squash` if you just want to combine the commits but keep the message</div><div># Or `reword` if you want to edit the message. You must have a `pick` at the top.</div><div># In your case, I would just recommend to stick with either squashing or `fixup` on all of the commits except the first one</div><div><br></div><div>git rebase -i upstream/master</div><div># This time rebase onto llvm-project master to make sure it will cleanly apply. Do the same here if necessary</div><div># If you get any conflicts, you will need to resolve them. Just goto the file that it says conflicted and look for <<<<<<< and >>>>>>> lines.</div><div># The <<<<<<< to ======= lines are the lines currently in llvm-master. The ======= to >>>>> lines are the ones you have modified in your commit.</div><div># You will need to remove the <, =, and > lines based on what you want to change</div><div># Remove from ==== to >>>> if you want to discard your changes, <<<< to ==== if you want to keep yours, or potentially just remove the <=> if you want both.</div><div><br></div><div># Run the following if you had conflicts</div><div>git add <conflicting file(s)></div><div>git rebase --continue</div><div><br></div><div># push to your fork</div><div>git push -u origin tmp # add -f if you already had a tmp branch in your online fork</div><div><br></div><div># Later on, if you want to delete the branch</div><div>git checkout master</div><div>git branch -D tmp</div><div>git push --delete origin tmp</div><div>```</div><div><br></div><div>For others</div><div>``` bash</div><div># If you need to generate a patch file that can be accepted by `git am`. You can also apply -U9999 if you really want to.</div><div>git format-patch upstream/master</div><div><br></div><div># If you want a simple diff file without commit information etc. Unless you</div><div>git diff upstream/master > changes.diff</div><div><br></div><div># Both formats of .diff and .patch are accepted by `git apply` or `patch -p1 ...` and are accepted by differential.</div><div>```</div><div><br></div><div>After review</div><div>``` bash</div><div>arc patch D#####</div><div>git branch # Confirm you are on arcpatch-D#####</div><div>git push upstream HEAD:master # or wherever.</div><div>```</div><div><br></div><div>Note: I'm using the github markdown format of ``` to represent a code block and ` to represent a code or single line to be considered separate, so mentally strip those when reading them</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Nov 8, 2019 at 6:33 PM Joan Lluch via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi All,<br>
<br>
Ok, just for the matter of providing feedback that may be useful for others, I figured out one way to do it based on the setup that I described earlier. It can be something like this<br>
<br>
git checkout patchbranch    # checkout to the patch branch, this is the one containing the differential patch code<br>
git checkout -b tmp              # checkout to a new tmp branch<br>
git reset —soft master         # set the tmp head to the master head without touching any files, so now the next commit will contain the delta from master<br>
git commit                            # commit the delta from master, this is the where to add the required commit message and the 'Differential Revision' URL<br>
git push origin tmp:master   # push the tmp branch to the remote ‘master’ branch<br>
(the tmp branch can be deleted now as it will have no more use)<br>
<br>
Now, if the master to patchbranch diff has been properly submitted to Phabricator, all the steps above except the last one can be replaced by executing this:<br>
<br>
git checkout master<br>
arc patch D<revision><br>
<br>
According to the docs, "this will create a new branch called arcpatch-D<Revision> based on the current master and will create a commit corresponding to D<Revision> with a commit message derived from information in the Phabricator review"<br>
<br>
This also sets the current branch to arcpatch-D<Revision>, so the only remaining thing to do is pushing the changes to the remote master:<br>
<br>
git push origin arcpatch-D<Revision>:master<br>
<br>
That’s all. The git system will inform whether there’s been another commit being pushed while preparing this one, in such case it would require to start over with a fresh pull from master<br>
<br>
John<br>
<br>
<br>
<br>
<br>
> On 8 Nov 2019, at 17:48, Blower, Melanie <<a href="mailto:melanie.blower@intel.com" target="_blank">melanie.blower@intel.com</a>> wrote:<br>
> <br>
> No doubt there's a way that's not interactive.  There's a free online copy of the "pro git" tome online, for what it's worth!<br>
> <br>
>> -----Original Message-----<br>
>> From: Joan Lluch <<a href="mailto:joan.lluch@icloud.com" target="_blank">joan.lluch@icloud.com</a>><br>
>> Sent: Friday, November 8, 2019 11:46 AM<br>
>> To: Blower, Melanie <<a href="mailto:melanie.blower@intel.com" target="_blank">melanie.blower@intel.com</a>><br>
>> Cc: llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>; Sanjay Patel <<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>><br>
>> Subject: Re: [llvm-dev] Workflow to commit changes using git alone (?)<br>
>> <br>
>> <br>
>> Hi Melanie,<br>
>> <br>
>> I would have hoped for a more automatic way, but I will give “--amend” a try.<br>
>> <br>
>> Thanks for that!<br>
>> <br>
>> John<br>
>> <br>
>> <br>
>>> On 8 Nov 2019, at 17:36, Blower, Melanie <<a href="mailto:melanie.blower@intel.com" target="_blank">melanie.blower@intel.com</a>><br>
>> wrote:<br>
>>> <br>
>>> <br>
>>> <br>
>>>> -----Original Message-----<br>
>>>> From: Joan Lluch <<a href="mailto:joan.lluch@icloud.com" target="_blank">joan.lluch@icloud.com</a>><br>
>>>> Sent: Friday, November 8, 2019 11:29 AM<br>
>>>> To: Blower, Melanie <<a href="mailto:melanie.blower@intel.com" target="_blank">melanie.blower@intel.com</a>><br>
>>>> Cc: llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>; Sanjay Patel<br>
>>>> <<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>><br>
>>>> Subject: Re: [llvm-dev] Workflow to commit changes using git alone<br>
>>>> (?)<br>
>>>> <br>
>>>> Hi Melanie,<br>
>>>> <br>
>>>> Thanks for your reply, but if I understand it well, this implies<br>
>>>> making changes to the local ‘main’ branch, and push from that, which<br>
>>>> is what I want to avoid. But still, if I push from ‘main’, how do I<br>
>>>> fold a number of local commits into a single one, with a single comment, as<br>
>> appropriate for LLVM?.<br>
>>> [Blower, Melanie] I'm not a sophisticated git user, but I do know how to fold<br>
>> local commits.<br>
>>> % git commit --amend<br>
>>> Assuming your workspace has several commits and you want to compress<br>
>>> then into 1 before push This is an interactive process, git will pop<br>
>>> you into an editor, maybe 'vi' with a bunch of SHA codes listed. What<br>
>>> I do is, Keep the top line unmodified, on subsequent lines use the 's' letter to<br>
>> indicate that you want to squash it into the previous After you write out the file<br>
>> that git put you into, it will prompt you again to finalize the commit message for<br>
>> the compressed commit. It's all local so you can give it a try.<br>
>>>> <br>
>>>> My workflow consists on creating different local branches to avoid<br>
>>>> changes on the ‘main’ branch. This allows me a couple of things:<br>
>>>> First, I always keep my local ‘main’ branch in sync with the remote<br>
>>>> one, so it’s very easy to spot differences with my working ones by<br>
>>>> just running diff between them. Second, I can do an undo things, or<br>
>>>> test them in my working branches as many times as I want and commit<br>
>>>> often. I can even start from scratch from main again by just creating<br>
>>>> a new branch from that, without ever messing with the ‘main’ branch.<br>
>>>> Also, separating work into branches allows for implementing another patch<br>
>> while a previous one is waiting review, (while still never touching ‘main’).<br>
>>>> <br>
>>>> In the past, I worked using a similar environment on a small team.<br>
>>>> Everyone's local changes were pushed to the remote repo at the end of<br>
>>>> the day by first merging into our local ‘main’ and then pushing to<br>
>>>> the remote ‘master’. This works on a small team because it doesn’t<br>
>>>> matter if a number of local commits get pushed together. Also<br>
>>>> everybody is happy to fix conflicts created by others if they happen, as<br>
>> there’s no ‘reviews’ to begin with.<br>
>>>> <br>
>>>> In the case of LLVM it’s desirable that every reviewed patch is<br>
>>>> pushed as a single commit with the appropriate comment. Ideally, I<br>
>>>> would want to commit and push the difference between a local working<br>
>>>> branch and the ‘main’ branch, which is what I can’t figure out how do<br>
>>>> do. I would be surprised if there’s not a simple solution for that.<br>
>>>> <br>
>>>> Thanks.<br>
>>>> <br>
>>>> John<br>
>>>> <br>
>>>> <br>
>>>> <br>
>>>>> On 8 Nov 2019, at 16:24, Blower, Melanie <<a href="mailto:melanie.blower@intel.com" target="_blank">melanie.blower@intel.com</a>><br>
>>>> wrote:<br>
>>>>> <br>
>>>>> <br>
>>>>> <br>
>>>>>> -----Original Message-----<br>
>>>>>> From: llvm-dev <<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">llvm-dev-bounces@lists.llvm.org</a>> On Behalf Of Joan<br>
>>>>>> Lluch via llvm-dev<br>
>>>>>> Sent: Friday, November 8, 2019 6:35 AM<br>
>>>>>> To: llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
>>>>>> Subject: [llvm-dev] Workflow to commit changes using git alone (?)<br>
>>>>>> <br>
>>>>>> Hi all,<br>
>>>>>> <br>
>>>>>> I have recently given commit access to LLVM and successfully pushed<br>
>>>>>> a test commit from my local master branch.<br>
>>>>>> <br>
>>>>>> However, I can’t find which is the recommended workflow for<br>
>>>>>> committing more serious stuff using git alone. I have read the docs<br>
>>>>>> but everything seems to still require svn before bridging to github.<br>
>>>>>> I want to use git alone to commit a patch that I got reviewed.<br>
>>>>> [Blower, Melanie]<br>
>>>>> I recently made my first commit to llvm using git, I can't speak to<br>
>>>>> whether this<br>
>>>> is recommended flow. First get code review and approval, then:<br>
>>>>> git clone <a href="https://github.com/llvm/llvm-project.git" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project.git</a> ## get the llvm<br>
>>>>> tree ## apply your patch, test your patch Git add ... files Git<br>
>>>>> commit ... commit message should include url to the phabricator<br>
>>>>> review Git pull --rebase ## if your clone is behind master, do this<br>
>>>>> to pull in the changes neatly Git push ## This will prompt you to<br>
>>>>> provide github identity<br>
>>>>> <br>
>>>>>> <br>
>>>>>> I currently have a local 'master' branch that I keep identical to<br>
>>>>>> the upstream branch. I also have another local branch (let's call<br>
>>>>>> it 'patchbranch' for the purposes of this question) where I<br>
>>>>>> committed the changes for the patch I want to push. I created the<br>
>>>>>> diff file by running git<br>
>>>> diff to compare my local 'master'<br>
>>>>>> with 'patchbranch’ branches and uploaded the file to Phabricator. I<br>
>>>>>> got the patch reviewed and I want to commit it now to the upstream<br>
>>>>>> master. I make sure my 'patchbranch' catches all the upstream<br>
>>>>>> changes by pulling from 'master', merging 'master' into my<br>
>>>>>> 'patchbranch and running<br>
>>>> the relevant tests.<br>
>>>>>> <br>
>>>>>> I want to push my local 'patchbranch' to the upstream ‘master’ in<br>
>>>>>> GitHub without affecting my local master branch. I also need to<br>
>>>>>> make sure that my patch is pushed as a single commit. I do not want<br>
>>>>>> to merge my local 'patchbranch' into my local 'master' because I<br>
>>>>>> want to keep<br>
>>>> my local 'master'<br>
>>>>>> clean and always identical to, or only slightly behind, the upstream branch.<br>
>>>>>> <br>
>>>>>> I have read the documentation but all the described workflows seem<br>
>>>>>> to imply the use of svn at some point, which I do not want to, or<br>
>>>>>> know how to use. I understand this is a basic question but I used<br>
>>>>>> git before with small teams only, so a detailed workflow for LLVM<br>
>>>>>> commits using<br>
>>>> git alone would be appreciated.<br>
>>>>>> <br>
>>>>>> Thanks,<br>
>>>>>> <br>
>>>>>> John<br>
>>>>>> <br>
>>>>>> <br>
>>>>>> <br>
>>>>>> <br>
>>>>>> _______________________________________________<br>
>>>>>> LLVM Developers mailing list<br>
>>>>>> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
>>>>>> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
>>> <br>
> <br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>