[XDA-University] jamieg71:
For all the things you can do in Android

somewhere someone has made a great definitive guide

that will help to both guide you

and provide a basic understanding of the steps involved

assuring you of success in your android tweaking endeavour.

This is not one of those guides.

I'm going to do my best to articulate my

dysfunctional

and admitted retardation

of an understanding of git.

I'll provide some links to guides I have found

so you can check them out and hopefully get a better grasp than I.

When you do, post your tips and tricks here..

I will add links to any posts with tips tricks or guides so you get your proper credit.

(if your into that sorta thing)

This guide is in no particular order and

is subject to random mistakes and inaccuracies.

I will be putting all git commands in red

If it's in red you can assume you just type that and hit enter.
​

What is Git?

Git is a tool used to manage projects housed on github and/or locally on your machine. For a greater understanding and comprehensive guide try gitready.com

Cloning

The simplest of things to do with git. Same steps to clone any repository be it your own or one from another github.

git clone <URL of your repository on github> -b <branch> (name of repo)

Example:

[COLOR="Red"]git clone git@github.com:jamieg71/kernel.git -b master msm8960
[/COLOR]

This tells it what to clone, denotes the branch with -b in this case branch

name is 'master' and finally (name of repo) tells git what you wish for your

cloned repository to be named in this case 'msm8960'.

Making commits & Pushing

Let's say you want to make a couple changes to an app and then push those changes back to github,

we'll use ROMControl for an example.

Navigate to root of ROMControl directory.

First do

repo start ska43 .

Here use the name of the branch you are on, for SofaKingAndroid 4.3 it's "ska43",

also include the dot [space dot] "." at the end of the command.

If instead of working within the rom source in /packages/apps/ you

instead had cloned ROMControl to it's own seperate folder, this is not necessary.

Some helpful commands-

Once you've made your changes, (and built to be sure everything works as planned....)

git status Just for a reference of what you've done, it will also show any files with a "~" in case your like me and occasionally screw up

To stage changes before committing you have multiple options-

Now to commit-

git commit -m 'your message here' Put a brief description of what your commit involves

To Push-

git push <URL of your repository on github>

Example:

[COLOR="Red"]git push git@github.com:SofaKingAndroid/packages_apps_ROMControl.git[/COLOR]

Fetching Upstream Changes

What if you had forked a project and been working on it for awhile, and you notice there where changes to the original source. Now you need to pull in upstream changes. To do this let's clone our fork to it's own folder on our machine-

We will assume you work in ~/android/ and know how to mkdir upstrm4krnl && cd upstrm4krnl

git clone <URL of your repository on github> -b <branch> (name of repo)

Example:

[COLOR="Red"]git clone git@github.com:jamieg71/kernel.git -b master msm8960[/COLOR]

This tells it what to clone, denotes the branch with -b in this case branch

name is 'master' and finally (name of repo) tells git what you wish for your

cloned repository to be named in this case 'msm8960'.

To add a remote repository to fetch upstream changes, (where you forked from)

git remote add upstream <URL of remote repository>

Example:

[COLOR="Red"]git remote add upstream git@github.com:CyanogenMod/android_kernel_htc_msm8960.git[/COLOR]

[COLOR="Red"]git fetch upstream [/COLOR]
This will add the log and pre stage all the changes on the remote repository.
After doing this Be aware of what your intentions are. If there have only been
minor changes with low likelyhood of major conflicts go ahead with merge.
Otherwise it may be best to cherry-pick specific changes.

To add these changes to your working files you have some options, I'm positive these are not the extent of those options but perhaps someone with better know-how will chime in....
[quote]
[COLOR="Red"]git merge upstream/master[/COLOR]
This merges all commits from both the upstream repository and any commits
you made to your forked repo.

[COLOR="Red"]git pull upstream/master[/COLOR]
This will pull in changes only from the remote repository[/quote]

For a better explanation see [url="http://eagain.net/articles/git-for-computer-scientists/#history"]Git for Computer Scientists[/url]

Now do-

[COLOR="Red"]git checkout master[/COLOR]
This should return you to your working branch

of course do a [COLOR="Red"]git status[/COLOR]

Finally do-

[COLOR="Red"]git add .[/COLOR]

[COLOR="Red"]git commit -m 'commit message'[/COLOR]

[COLOR="Red"]git push[/COLOR]
From cloned repo a simple git push should suffice. If not go ahead
and do git push <URL of your forked repo>
Example: [code][COLOR="Red"]git push git@github.com:jamieg71/kernel.git[/COLOR]

Cherry-picking

What is cherry-picking? Simple answer- grabbing commits from a different repo and adding to your own.

Here's some links-

Cherry-Pick-Manual from Kernel.org it don't 'git' more comprehensive than that.

Gitready Guide Greate guide for beginners to experts

I never really got it until I found this on Pastebin. Unknown author or I'd give em creds in all my threads.

And another here it has a different take at the begining

A multitude of guides can be found on Google, I have found the majority take for granted there is a roofer trying to follow them and don't necessarily explain some of the simple things. Which is always what screws me up..

Here's what works for me. I'm going to c/p a session from terminal and will highlight the actual git commands in red and add notes in green (0)

jamie@KANGBOT-1:~/android/sofa/frameworks$ [COLOR="Red"]git clone git@github.com:SofaKingAndroid/frameworks_base.git -b ska43 base[/COLOR]
Cloning into 'base'...
remote: Counting objects: 796444, done.
remote: Compressing objects: 100% (192783/192783), done.
remote: Total 796444 (delta 525643), reused 795809 (delta 525149)
Receiving objects: 100% (796444/796444), 1.06 GiB | 6.67 MiB/s, done.
Resolving deltas: 100% (525643/525643), done.
Checking out files: 100% (21192/21192), done.
jamie@KANGBOT-1:~/android/sofa/frameworks$ cd base

jamie@KANGBOT-1:~/android/sofa/frameworks/base$ [COLOR="Red"]git status[/COLOR]
# On branch ska43
nothing to commit, working directory clean
jamie@KANGBOT-1:~/android/sofa/frameworks/base$ [COLOR="Red"]git remote add ok git@github.com:AOKP/frameworks_base.git[/COLOR] [COLOR="SeaGreen"](1)[/COLOR]
jamie@KANGBOT-1:~/android/sofa/frameworks/base$ [COLOR="Red"]git fetch ok[/COLOR]
remote: Counting objects: 40, done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 23 (delta 14), reused 12 (delta 3)
Unpacking objects: 100% (23/23), done.
From github.com:AOKP/frameworks_base
* [new branch] jb -> ok/jb
* [new branch] jb-broke -> ok/jb-broke
* [new branch] jb-mr1 -> ok/jb-mr1
* [new branch] jb-mr2 -> ok/jb-mr2
jamie@KANGBOT-1:~/android/sofa/frameworks/base$ [COLOR="Red"]git cherry-pick 4829174d6f6fa33cd51f2bde9df2e100420ef3bf[/COLOR] [COLOR="SeaGreen"](2)[/COLOR]
[ska43 f8380a3] SystemUI: 4G/LTE icon toggle
Author: Roman Birg <romanbirg@gmail.com>
2 files changed, 17 insertions(+), 2 deletions(-)

jamie@KANGBOT-1:~/android/sofa/frameworks/base$ [COLOR="Red"]git status[/COLOR]
# On branch ska43
# Your branch is ahead of 'origin/ska43' by 1 commit.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean

jamie@KANGBOT-1:~/android/sofa/frameworks/base$ [COLOR="Red"]git remote add upstream git@github.com:SofaKingAndroid/frameworks_base.git[/COLOR] [COLOR="SeaGreen"](3)[/COLOR]
jamie@KANGBOT-1:~/android/sofa/frameworks/base$ [COLOR="Red"]git push[/COLOR]
Counting objects: 31, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (16/16), 1.61 KiB, done.
Total 16 (delta 10), reused 0 (delta 0)
To git@github.com:SofaKingAndroid/frameworks_base.git
05ade0e..f8380a3 ska43 -> ska43

Notes

1) git remote add (initials) <URL of repository to grab commits>

The initials are what you make em, I used "ok"

2) git cherry-pick <Change ID or SHA of commit you want>

To find the change ID refer to commit history for

the project you are working on after fetch

you may be able to do git log and find the

change ID you want.

3) git remote add upstream <URL of your github repository>

Pretty sure I could have done git checkout ska43 and

it would have returned me to my working files, but I

wasn't sure so I did it this way.

This is an example of a very simple cherry-pick with no conflicting code. Most times when cherry-picking there will be many conflicts. You can use gitk (a GUI for git) to help resolve conflicts and get ready to merge.

More to come.

If you see a mistake or have anything to add

please by all means

respond in this thread.

More to come-​