初识Github

Githubhtml

搞了一下午,大概知道怎么操做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).jquery

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

 

 

,其实能够把它就理解为远程仓库吧,用于存放代码的地方,就这么简单,它的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.gitnginx

 
 
而问题来了,若是你本身不管更新或者提交都用的是这个remote,那永远不会有冲突,呵呵,缘由很简单,你在闭门造车,本身搞本身的。master的代码即便更新了,而你更新的是这个remote那确定是更新不到的,因此若是须要(通常都是须要的)更新,那就添加一个remote,命名为upstream,url多是这样的,具体根据具体的项目的git url肯定,例如nginx的original repo地址为
 
git remote add upstream  https://github.com/git-mirror/nginx.git
 
而后利用这个地址就能够更新了到最新代码了。
 
说一下更新,更新通常有两个步骤,先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了。
 
不断更新。。。
相关文章
相关标签/搜索