初识Github

Github

搞了一下午,大概知道怎么操作github,记录一下。
 
 
1.遵循官方文档https://help.github.com/articles/set-up-git#platform-linux,一步步配置好环境。用户名,密码,密码缓存等等。
 
 
2.创建一个Repository。(可参见这里 
 
 
点击这里,创建一个Repository。创建Public的for free,Private的for fee,穷屌丝就算了。
 
当然也可以用命令行创建,先get一个curl,然后调用git api 去创建。参看这里
 
OK,如果看了上面的可参见那里基本这个过程就知道了,一步一步做行。这里主要解释一下一点概念。
 
 
什么是repo?
 
Git stores all of your project files in a repository. If you are able to view hidden files on your system, you'll see a subdirectory called ".git" in the project directory where you run git init. This is where Git stores all of your commits, as well as everything else it needs. In addition to your local, you can also have remote repositories (like GitHub repos). Remote repositories are the same as your local repository, but stored on a different server or computer for easy collaboration, backup, and general awesomeness.
 
与SVN相比,Github主要不同的是就是分布式,什么意思,简单的就是说,都知道SVN提交代码是直接往服务器那里提的,任何修改都会在SVN server那里得到体现,但这里有一个问题,对于一个开源项目而言,感觉这就是悲剧性的,想一想,每一次commit代码前,已经有可能几百人几千人在你前面commit了代码,然后当你看到那一堆红(conflict)的时候,你和你的小伙伴们都肯定惊呆了。当然,作为一个版本管理工具,Github其实也有这个过程,因为肯定需要往一个集中的地方commit,merge等等,但是这个过程前,还有一个过程SVN没有的,就是往自己本地提交代码。这个意味着,你开发的东西是在你自己分支上开发的,不会影响到任何的人,而且别人也不会影响到你,当需要和代码时,只要将自己分支的代码合并到主线(master)上就ok了。至于本地仓库是在哪里,如果看了上面的英文就知道,当git init之后,目录下就会有一个子目录叫做.git,这里就是你的本地仓库。
 
基本过程就是,你所有的代码修改都先提交到本地的仓库里,然后如果要合并到master,那么就需要拉取master的代码,如果conflict,就解决掉,然后merge,然后commit到本地仓库,这个时候你就已经从自己的分支返回到master分支上,然后提交(push)到远程服务器就over了。
 
这里简单掌握几条command就行:
 
git add
git commit
git push
git remote
 
说一下git remote,其他自己git xxx --help去。
git remote有一个option -v,可以列出当前所有的远程repository。
 
git remote还有很多的commands,例如git remote add,rm,rename等等。
给个例子:
怎么理解remote,官方的解释是
 

A remote is a repository stored on another computer, in this case on GitHub's server. It is standard practice (and also the default when you clone a repository) to give the name originto the remote that points to your main offsite repository (for example, your GitHub repository).

Git supports multiple remotes. This is commonly used when forking a repository.

 

 

,其实可以把它就理解为远程仓库吧,用于存放代码的地方,就这么简单,它的url类似于https://github.com/octocat/your-repository.git。它是一个本地的概念,只要url是对的,你可以对他任意的命名,fuck,suck都没有问题,它的名字可以作为标识用,例如往服务器提交代码时
git push origin master
 
 
3.Fork 一个repo
 
什么是fork,为什么git搞这些无厘头的东西,呵呵。
其实这个东西很容易理解,哪里见过fork,写C的时候见过,干什么的,创建(fork)子进程,fork出来的子进程和父进程有什么关系,就是共享text segment,copy父进程的heap,stack,data's space,但是不同的就是pid。好吧,你就这样理解git的这个fork吧,看来IT的东西都是想通的。fork就是按照original的repo创建了一个你自己的repo,初始fork出来的时候,所有的东西都是一样的,除了“pid”,你的repo的git url是
 
 
original的url是
 
 
就这个不同了。
 
怎样fork可以看这里,具体过程就不描述了。
 
 
刚刚fork出来的repo默认有一个remote叫做origin,用git remote -v可以查看到其url。类似是这样的
 

https://github.com/your-name/nginx.git

 
 
而问题来了,如果你自己无论更新或者提交都用的是这个remote,那永远不会有冲突,呵呵,原因很简单,你在闭门造车,自己搞自己的。master的代码即使更新了,而你更新的是这个remote那肯定是更新不到的,所以如果需要(一般都是需要的)更新,那就添加一个remote,命名为upstream,url可能是这样的,具体根据具体的项目的git url确定,例如nginx的original repo地址为
 
 
然后利用这个地址就可以更新了到最新代码了。
 
说一下更新,更新一般有两个步骤,先fetch,然后merge,如果想一步到位就直接pull。
fetch的意思就是从remote repo拉代码到本地repo,如果要有冲突就需要merge代码了,而pull会自动帮你fetch代码下来,并在你没有review过代码之前,尝试自动帮你merge代码到当前的工作目录中,一般不建议直接pull,而是先fetch,再手动merge。
 
基本的github操作就是这样,其他用到再慢慢研究下。
 
 
附部分命令:
 
Git常用操作命令收集:
1) 远程仓库相关命令
检出仓库:$ git clone git://github.com/jquery/jquery.git
查看远程仓库:$ git remote -v
添加远程仓库:$ git remote add [name] [url]
删除远程仓库:$ git remote rm [name]
修改远程仓库:$ git remote set-url --push [name] [newUrl]
拉取远程仓库:$ git pull [remoteName] [localBranchName]
推送远程仓库:$ git push [remoteName] [localBranchName]
 
* 如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:
$ git push origin test:master         // 提交本地test分支作为远程的master分支
$ git push origin test:test              // 提交本地test分支作为远程的test分支
 
2)分支(branch)操作相关命令
查看本地分支:$ git branch
查看远程分支:$ git branch -r (如果还是看不到就先 git fetch origin 先)
创建本地分支:$ git branch [name] ----注意新分支创建后不会自动切换为当前分支
切换分支:$ git checkout [name]
创建新分支并立即切换到新分支:$ git checkout -b [name]
直接检出远程分支:$ git checkout -b [name] [remoteName] (如:git checkout -b myNewBranch origin/dragon)
删除分支:$ git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:$ git merge [name] ----将名称为[name]的分支与当前分支合并
合并最后的2个提交:$ git rebase -i HEAD~2 ---- 数字2按需修改即可(如果需提交到远端$ git push -f origin master 慎用!)
创建远程分支(本地分支push到远程):$ git push origin [name]
删除远程分支:$ git push origin :heads/[name] 或 $ git push origin :[name]
 
* 创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)
$ git symbolic-ref HEAD refs/heads/[name]
$ rm .git/index
$ git clean -fdx
 
3)版本(tag)操作相关命令
查看版本:$ git tag
创建版本:$ git tag [name]
删除版本:$ git tag -d [name]
查看远程版本:$ git tag -r
创建远程版本(本地版本push到远程):$ git push origin [name]
删除远程版本:$ git push origin :refs/tags/[name]
合并远程仓库的tag到本地:$ git pull origin --tags
上传本地tag到远程仓库:$ git push origin --tags
创建带注释的tag:$ git tag -a [name] -m 'yourMessage'
 
4) 子模块(submodule)相关操作命令
添加子模块:$ git submodule add [url] [path]
    如:$ git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
初始化子模块:$ git submodule init  ----只在首次检出仓库时运行一次就行
更新子模块:$ git submodule update ----每次更新或切换分支后都需要运行一下
删除子模块:(分4步走哦)
1) $ git rm --cached [path]
2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉
3) 编辑“ .git/config”文件,将子模块的相关配置节点删除掉
4) 手动删除子模块残留的目录
 
5)忽略一些文件、文件夹不提交
在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如
target
bin
*.db
 
6)后悔药
删除当前仓库内未受版本管理的文件:$ git clean -f
恢复仓库到上一次的提交状态:$ git reset --hard
回退所有内容到上一个版本:$ git reset HEAD^
回退a.py这个文件的版本到上一个版本:$ git reset HEAD^ a.py
回退到某个版本:$ git reset 057d
将本地的状态回退到和远程的一样:$ git reset –hard origin/master 
向前回退到第3个版本:$ git reset –soft HEAD~3
 
7)Git一键推送多个远程仓库
编辑本地仓库的.git/config文件:
[remote "all"]
    url = git@github.com:dragon/test.git
    url = git@gitcafe.com:dragon/test.git
这样,使用git push all即可一键Push到多个远程仓库中。
 
 
----------------------------------另外---------------------------------------
 
1. 从工程删除文件后,想删除的文件从仓库中删除,不要直接
git rm -r .
这会将当前目录下所有的文件删除,而是要
git rm -r --cache .
如果真的不慎执行了第一步,那只能
git reset --hard HEAD
回退到最后一次commit了。
 
不断更新。。。
原文地址:https://www.cnblogs.com/chiefhsing/p/3239403.html