git客户端和github配置请参考:http://wuyuans.com/2012/05/github-simple-tutorial/
https://git-scm.com/book/zh/v1
如果不是用github,用其他的远程仓库也是一样,ssh配置和设置远程仓库改为自己想要的就可以了 $ git remote add origin [email protected]:yourName/yourRepo.git
配置 git ssh keys
运行以下命令,一直回车,文件名可随意指定 ssh-****** -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/github
如果对**机制不熟悉,建议不要指定 -f 参数,直接使用默认的 id_rsa 文件名。
拉代码
-
git pull origin master从远程仓库拉代码到本地(自动merge代码) -
git pull不加参数的话 只是针对当前分支与远程库进行同步更新(自动merge代码)
相当于是从远程获取最新版本并merge到本地
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并 -
git fetch相当于是从远程获取最新版本到本地,不会自动merge
以上命令的含义:
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并
上述过程其实可以用以下更清晰的方式来进行:git fetch origin mastergit diff tmpgit merge tmp
-
git clone $1--branch $2--single-branch $3
cd $3 && git checkout $4$2是分支名称,$3是你clone的本地路径,$4是commit-id -
git pull --rebase
使用rebase推送而非merge
如果您正在团队中工作并且整个团队都在同一条branch上面工作,那么您就得经常地进行fetch/merge或者pull。Git中,分支的合并以所提交的merge来记录,以此表明一条feature分支何时与主分支合并。但是在多团队成员共同工作于一条branch的情形中,常规的merge会导致log中出现多条消息,从而产生混淆。因此,您可以在pull的时候使用rebase,以此来减少无用的merge消息,从而保持历史记录的清晰。 -
git config branch.BRANCH_NAME_HERE.rebase true也可以将某条branch配置为总是使用rebase推送
-
-
git checkout featuregit rebase master
使用rebase而非merge来拉取上游修改
使用git rebase将一个feature分支变基到master分支- 在执行git rebase后解决合并冲突
合并冲突表示两个提交修改了同一个文件的同一行,Git不知道该应用哪一个修改。 - Git会为你提供3个选择来修复导致冲突的提交(fa39187):
- 可以运行
git rebase --abort来完全取消变基。这么做会取消变基修改,并将分支置回到执行git rebase之前的状态。 - 可以运行
git rebase --skip来完全忽略该提交。这样,有问题的提交所引入的变化就不会被添加到历史中。 - 在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用”git-add”命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:
$ git rebase --continue - 可以使用与合并冲突相同的标准步骤来解决冲突。
- 可以运行
- 在执行git rebase后解决合并冲突
- 克隆一个特定的远程分支
git initgit remote add -t-f origin branchgit checkout - 每隔X秒运行一次git pull
通常,合并冲突出现的原因在于你正在工作的本地仓库不再反映远程仓库的当前状态。这正是我们为什么每天早晨要首先执行一次git pull的缘故。此外,你还可以在后台通过脚本(或是使用GNU Screen)每隔X秒调用一次git pull:$ screen$ for((i=1;i<=10000;i+=1)); do sleep X && git pull; done
回退代码
-
git reset --hard [commitid]回退到某个提交
提交
-
git commit -m "story #3, add user model"提交代码到本地仓库(后面是增加提交提示) -
git commit -a "xxx"自动检查应该commit什么文件。如果是新增的文件,仍然要使用git add来添加 -
git add -A表示把中所有tracked文件中被修改过或已删除文件和所有untracted的文件信息添加到索引库。 -
git add -u把中所有tracked文件中被修改过或已删除文件的信息添加到索引库。它不会处理untracted的文件。 -
git add是添加到即将提交的区域git stash是暂存修改,相当于把修改先保存到栈中,还原工作现场,即文件没有修改,git add的时候不会添加之前修改的文件。git add撤销可使用git reset命令 -
git push origin branchname提交当前分支到远程分支(远程新建branchname)
提交前查看差异
git statusgit diff #查看尚未缓存的文件更新了哪些部分-
git diff --cache查看staged的文件和上次提交的快照之间的差异 -
git update-index --assume-unchanged
忽略追踪文件中的变更
如果你和你的同事操纵的是相同分支,那么很有可能需要频繁执行git merge或是git rebase。不过,这么做可能会重置一些与环境相关的配置文件,这样在每次合并后都需要修改。与之相反,你可以通过如下命令永久性地告诉Git不要管某个本地文件
回滚提交
-
git checkout app/model/user.rb将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚 -
git checkout .#取消本地所有文件的修改 -
git commit --amendgit commit -amend –m 'modified commit log'#更新最后提交的message -
git reset commit-idgit push -f origin branch
分支
-
git branch --set-upstream-to=origin/<远端branch_name> <本地branch_name>设置原程分支 -
git remote prune origin将远程已经不存在的但在本地显示为远程分支的删掉 - merge有冲突,回退merge操作
git reset HEADgit checkout .git clean -fd
- 合并某个分支上的单个commit
git cherry-pick <commit id>
用于把另一个本地分支的commit修改应用到当前分支,
如果在cherry-pick 的过程中出现了冲突,就跟普通的冲突一样,手工解决 - 合并某个分支上的一系列commits
在一些特性情况下,合并单个commit并不够,你需要合并一系列相连的commits。这种情况下就不要选择cherry-pick了,rebase 更适合。
假设你需要合并feature分支的commit76cada ~62ecb3 到master分支。
首先需要基于feature创建一个新的分支,并指明新分支的最后一个commit:git checkout -bnewbranch 62ecb3
然后,rebase这个新分支的commit到master(–ontomaster)。76cada^ 指明你想从哪个特定的commit开始。git rebase --ontomaster 76cada^
得到的结果就是feature分支的commit 76cada ~62ecb3 都被合并到了master分支。
https://ariejan.net/2010/06/10/cherry-picking-specific-commits-from-another-branch/
列出分支
-
git branch列出本地所有的分支 -
git branch -a列出本地和远程所有的分支 -
git branch -r列出远程分支
删除分支
-
git branch -d xxxxx删除本地分支 -
git branch -D new_branch强制删除分支
切换分支
-
git checkout new_branch切换到new_branch分支 -
git checkout -b <branch>创建并切换分支 -
git push origin :<branchName>推送一个空分支到远程分支,其实就相当于删除远程分支 - 删除不存在对应远程分支的本地分支
git remote show origin
这时候能够看到是stale的,使用git remote prune origin可以将其从本地版本库中去除。
更简单的方法是使用这个命令,它在fetch之后删除掉没有与远程分支对应的本地分支:git fetch -p
这里所指的本地分支都是指具有origin标志的,在远程版本库有对应分支的本地分支,而不是没有origin标志的本地开发分支,这些运用这种方式是不会删除的。 - 重命名远程分支
在git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支。
例如下面的例子中,我需要把 devel 分支重命名为 develop 分支:-
git push --delete origin devel删除远程分支 -
git br -m devel develop重命名本地分支 -
git push origin develop推送本地分支
-
合并
+ git merge --no--ff
其他
git rebase-
git tag可以将某个具体的版本打上一个标签,这样你就不需要记忆复杂的版本号哈希值了,例如你可以使用git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用 revert_version标签名,而不是哈希值了 -
git remote -v查看远程仓库的地址
以下三种方式均可git config get --remote.origin.urlgit remote -vgit remote show origin
git log
http://www.cnblogs.com/BeginMan/p/3577553.html
+ git log 查看历史日志
+ git log -p
+ git log -1 HEAD最后一个提交者
+ git log cf2af99ee345d589317df2a1b2b8f85b3e17234c -1 -p 查看该commitid 对应的详细提交
+ git log --pretty=format:"%h - %an, %ar : %s"
+ git blame
如果出现混乱的情况,你一定想要找出是谁造成的。如果生产服务器宕机,那么找到罪魁祸首是比较容易的事情:只需执行git blame。该命令会显示出文件中每一行的作者,提交hash则会找出该行的上一次修改,还能看到提交的时间戳
+ git log --name-status —oneline
git checkout
-
git checkout:Git的checkout有两个作用,其一是在不同的branch之间进行切换,例如 ‘git checkout new_branch’就会切换到
new_branch的分支上去;另一个功能是还原代码的作用,例如’git checkout app/model/user.rb’就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚 -
git checkout .#取消本地所有文件的修改
git stash
- 在一个分支a开发完之后不想提交,想切到分支b中进行其他开发,可执行命令git stash保存工作现场(即修改的文件),
然后切到分支b中进行开发,开发完之后发现想要在分支c开发之前在分支a开发的东西,直接切到分支c,执行git stash pop命令,恢复工作现场
在git gui的缓存改动中查看修改的内容对比 -
git stash#备份当前的工作区的修改内容,将当前的工作区内容保存到新Git栈中。 -
git stash save "describe it"# give the stash a name -
git stash save --keep-index# stash only unstaged files -
git stash pop#从Git栈取出最新备份,index-1 -
git stash apply [email protected]{<index>}#取出最新index+1个备份,从0开始 git stash list-
git stash clear#清空所有Git栈 -
git stash branch <branchname> <stash>#用备份来创建分支
git revert
-
git revert用于用一个commit来记录并回滚早前的commit -
git revert HEAD~3#丢弃最近的三个commit,把状态恢复到最近的第四个commit,并且提交一个新的commit来记录这次改变 -
git revert -n master~5..master~2#丢弃从最近的第五个commit(包含)到第二个(不包含),但是不自动生成commit,这个revert仅仅修改working tree和index -
git reset --soft HEAD^#当提交了之后,你又发现代码没有提交完整,或者你想重新编辑一下提交的comment。修改完后,git commit -a -c ORIG_HEAD使用reset之前那次commit的注释、作者、日期等信息重新提交。- –hard:重设(reset) index和working directory,自从以来在working directory中的任何改变都被丢弃,并把HEAD指向。
- –soft:index和working directory中的内容不作任何改变,仅仅把HEAD指向。这个模式的效果是,执行完毕后,自从以来的所有改变都会显示在git status的“Changes to be committed”中。
- –mixed:仅reset index,但是不reset working directory。这个模式是默认模式,即当不显示告知git reset模式时,会使用mixed模式。这个模式的效果是,working directory中文件的修改都会被保留,不会丢弃,但是也不会被标记成“Changes to be committed”,但是会打出什么还未被更新的报告。即从staged区移动unstaged的working directory
git reset
-
git reset --soft HEAD^回滚最近一次commit -
git reset --hard HEAD~3永久删除最后3个commit -
git reset --hard HEAD~3git checkout topic/wip回滚最近几次commit,并把这几次commit放到叫做topic的branch上去
git tag
git tag -a v1.4 -m 'my version 1.4'-
git tag
v0.1
v1.3
v1.4
-m 选项则定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。 -
git show v1.4可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象
分享标签 -
git push origin v1.5默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可 -
git push origin --tags如果要一次推送所有本地新增的标签上去,可以使用 –tags 选项 -
git push origin --delete tag <tagname>删除tag这么用 - 推送一个空tag到远程tag
git tag -d <tagname>git push origin :refs/tags/<tagname>
git diff
-
git diff比较某文件与最近提交节点的差异。 -
git diff –cached<file>如果该文件已暂存 -
git diff <hashcode> <hashcode> <file>
比较某文件在提交节点a,节点b的差异。
技巧:如果省略后面一个hashcode,则默认表示与上一提交节点比较。(也可以利用^运算符)
git clean
git怎样删除未监视的文件untracked files
+ git clean -f删除 untracked files
+ git clean -fd 连 untracked 的目录也一起删掉
+ git clean -xfd 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
+ 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删 git clean -nxfd git clean -nf git clean -nfd
.gitconfig
.gitconfig
[user]
name = kingson4wu
email = [email protected]
[gui]
encoding = utf-8
recentrepo = F:/eclipseWork/vips-mobile-brand
[credential]
helper = store
[core]
autocrlf = input
savecrlf = false
Skill
- git恢复删除文件
git stashgit stash clear(前提是确定stash list都不要) - 提交代码
- 远程仓库无代码,本地有代码。目的:本地提交到远程仓库
- 新建一个文件夹,在里面添加项目代码。
- 右键,git init(或者通过命令行切换到当前目录,运行git init命令),把该项目变成一个git项目
- 配置.gitignore(添加提交忽略的文件)
- 在远程git添加repository,添加本地ssh到远程repository(若已经在本地电脑配置过以后再新建repository就不用再配置了)
- 添加远程仓库
git remote add origin github.com/kingsonWu/DesignPatterns.git - (先执行git status)添加需要提交的代码 git add -A(添加当前目录全部代码)
- 提交代码到本地仓库
git commit -m "first commit" - 同步远程仓库到本地仓库代码
git pull origin HEAD - 提交代码到远程仓库
git push -u origin master
- 远程已有仓库,在其分支上开发
- 在远程仓库配置ssh
- 新建一个文件夹,右键,git clone(或者切换到相应目录执行
git clone github.com/kingsonWu/DesignPatterns.git) - 进行开发,然后提交代码(查看(1)的6,7,8,9步骤)
PS:1.步骤8:如果执行失败,就按照提示还原有冲突的文件,然后再次尝试同步。
命令:git checkout – <有冲突的文件路径>
- 合并分支到master
- 开发代码并提交到远程分支
- 切换到master(
git checkout master) - 同步远程master到本地master(
git pull origin master)(前提是本地要merge的分支已经和远程的同步) -
git merge new_branch(合并new_branch分支到当前分支,即master) - 提交master分支到远程仓库 git push -u origin master
PS:解决冲突之后push之前先rebase
- 远程仓库无代码,本地有代码。目的:本地提交到远程仓库
git支持很多种工作流程,我们采用的一般是这样,远程创建一个主分支,本地每人创建功能分支,日常工作流程如下:
-
git checkout work去自己的工作分支 -
git commit -a提交工作分支的修改 -
git checkout master回到主分支 -
git pull获取远程最新的修改,此时不会产生冲突 - git checkout work回到工作分支
-
git rebase master用rebase合并主干的修改,如果有冲突在此时解决 -
git checkout master回到主分支 -
git merge work合并工作分支的修改,此时不会产生冲突。 -
git push提交到远程主干
这样做的好处是,远程主干上的历史永远是线性的。每个人在本地分支解决冲突,不会在主干上产生冲突。
PS :在最后一步,你提交的时候,若正巧有人在你前面执行了和你一样的流程,这时就会冲突了,就得 git pull; git rebase origin/master; git push
reference:http://qqurl.com/47hx
其他:
Gist 介绍 http://blog.csdn.net/xiaojianpitt/article/details/9347731
https://guides.github.com/activities/hello-world/
一个成功的 Git 分支模型:http://blog.jobbole.com/81196/
怎么取得git 打好的tag所对应的代码呢?
http://www.oschina.net/question/1030451_105857
先 git clone 整个仓库,然后 git checkout tag_name 就可以取得 tag 对应的代码了。 但是这时候 git 可能会提示你当前处于一个“detached HEAD" 状态,因为 tag 相当于是一个快照,是不能更改它的代码的,如果要在 tag 代码的基础上做修改,你需要一个分支: git checkout -b branch_name tag_name 这样会从 tag 创建一个分支,然后就和普通的 git 操作一样了。
/settings/hooks
设置git相关操作触发的脚本等