
这里要区分git和github
git操作是属于左半部分,github属于上面部分
git是自己本地仓库和自己远程仓库的操作
github是自己仓库和别人仓库(fork和被fork仓库)之间操作
https://github.com/812865052/learngit.git是仓库的https地址
git@github.com:812865052/learngit.git是仓库的ssh地址
Joe和其它贡献者已经对这个项目做了一些修改,而你将在他们的修改的基础上,还要再做一些修改。在你开始之前,你最好"同步你的fork",以确保在最新的复制版本里工作。下面是你要做的:

Linux:sudo apt-get install git
其他系统安装
首先要在某个文件夹(空的或者已经有文件)内执行:
git init
创建了一个git仓库
然后设置git属性
git config --global user.name "yefeimac" #可以不加--global
git config --global user.email "your email address" #可以不加--global
git config --global core.sshCommand "ssh -i /Users/yefei/.ssh/id_rsa" #这里设置git使用哪个密钥,非常好用
git配置文件地址: macOS and Linux: /Users/<username>/.gitconfig or ~/.gitconfig
在用ssh之前,你需要
先生成公钥私钥,然后将公钥加入到github的setting中,按照教程配置~/yefei/.ssh/config
也可以参考中文教程
它的大概过程:
1.设置本地的ssh key,打开git bash,输入命令:
ssh-keygen -t rsa -C "XXXXXX@XXXX.com" 其中双引号中是你注册github时用的邮箱。
一直回车,选择默认路径,和空密码。最后会在默认路径下生成.ssh文件夹,打开.ssh里面有两个文件,打开id_rsa.pub复制里面的密钥。
2.打开github,选择settings
点击ssh and gpg keys,选择ssh keys 右边的new ssh key。出现下面绿色框的内容,填写标题,并将自己刚才复制的密钥粘贴到key中。最后点击add ssh key.
titile随便取名字,一般让你自己明白是哪个电脑,比如yefeiMBP
3.查看是否成功。在git bash中输入命令:(注意是git bash,不是win自带的cmd中输入命令)
ssh -T git@github.com
会提示,是否continue,输入yes。后就会看到:
Warning:Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Hi zhangsiyao11! You've successfully authenticated, but GitHub does not provide shell access.
这样就成功了,不用理会warning。
同理,你的这个ssh既可以加到github上,也可以加到公司的gitlab里
配置GitHub仓库
在github上新建一个仓库具体见下图

1、首先执行类似与git remote add orgin https://github.com/812865052/newstock.git
2、执行git pull --rebase origin master (解决failed to push some refs to git的办法)
3、git push origin master
ssh git clone:
git clone git@github.com:project/repo.git
可以直接clone特定分支的代码
git clone 分支名 地址
本地仓库修改后,如何同步:
1、本地修改上传:
git add 文件名
git commit -m "comment"
或者删除文件
git rm 文件名/文件夹(前提是该文件或者文件夹在git所在目录里面)
然后提交 git commit -m "comment"
git push origin(reposity name) master
2、本地同步远程仓库代码:
git pull origin master(好像还可以用fetch,更安全,可以后面研究下)
查看远程仓库
git remote -v
新建仓库
git remote add gitname https://github.com/812865052/newstock.git
本地仓库改名
如果不想使用origin这个名字,可以用 git remote rename origin newname改名。
提交的时候,就变成了git push newname master
若大批量 增、删、改文件,显然一个个添加或删除是不可取的,以下命令可快捷操作暂存区(建议练习使用,加深对以下几个命令的理解):
git add -A 暂存区与工作区保持一致(stages All)
git add . 暂存区新建文件及更改文件(stages new and modified, without deleted)
git add -u 暂存区删除文件及更改文件(stages modified and deleted, without new)
diff各个版本区别
工作目录 vs 暂存区
git diff filename
意义:查看文件在工作目录与暂存区的差别。如果还没 add 进暂存区,则查看文件自身修改前后的差别。
也可查看和另一分支的区别。$ git diff branch filename
暂存区 vs Git仓库
git diff --cached filename
意义:表示查看已经 add 进暂存区但是尚未 commit 的内容同最新一次 commit 时的内容的差异。
也可以指定仓库版本:git diff --cached commit filename
工作目录 vs Git仓库
git diff commit filename
意义:查看工作目录同Git仓库指定 commit 的内容的差异。
commit=HEAD 时:查看工作目录同最近一次 commit 的内容的差异。
Git仓库 vs Git仓库
git diff commit commit
意义:Git仓库任意两次 commit 之间的差别。
如果你在本地做了错误提交,那么回退版本的方法很简单
先用下面命令找到要回退的版本的commit id:
git reflog
放弃本地修改:
git reset --hard
接着回退版本:
git reset --hard Obfafd
0bfafd就是你要回退的版本的commit id的前面几位
如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了。
首先要回退本地分支:
查看提交记录
git log-很详细的提交记录
git reflog-列表式的提交记录,很清晰,一目了然
如果需要恢复到某个提交记录那,可以用 git reset --head+git reflog查到的版本号
查询某个作者的提交记录
git log --author='rich.ye rich.ye@xxxx.com'
查看某次提交的修改记录
git show 20817a72da5b74b9ada10a2caccd69c3e4a59ad5
紧接着强制推送到远程分支:
git push -f origin master
注意:本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支
如果提示GitLab: You are not allowed to force push code to a protected branch on this project.则需要在gitlab setting里面的repository里面找到protect branch,要打开允许force操作

想保留本地修改,同时把远程代码更新到本地的话,最好的命令是git pull --rebase,只用git pull会多出很多无用的commit信息。详细信息参考git pull --rebase和这篇
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
或者是用git fetch upstream 然后git merge upstream/master 参考git pull 和 git fetch的区别?
如何同步不同名字的分支
The upstream branch of your current branch does not match
the name of your current branch. To push to the upstream branch
on the remote, use
git push gerrit HEAD:jacoco
To push to the branch of the same name on the remote, use
git push gerrit v4.7.0
查看本地和远程分支
git branch -a
查看本地分支
git branch
查看所有远程分支
git branch -r
创建分支
git branch test
切换分支
git checkout test
创建并且切换分支
git checkout -b test
git checkout -b 本地分支名x origin/远程分支名x
使用该方式会在本地新建分支x,并自动切换到该本地分支x。
采用此种方法建立的本地分支会和远程分支建立映射关系。
git fetch origin 远程分支名x:本地分支名x
使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。
采用此种方法建立的本地分支不会和远程分支建立映射关系。
重命名分支
在当前分支执行git branch -m new-branch-name,则把当前分支重新命名为new-branch-name
必须是相同名字的分支才能push,否则会报error: src refspec xxx does not match any / error: failed to push some refs to
把master代码合到当前分支
1.切换到主分支
git checkout master
2.使用git pull把master代码拉到本地
git pull upstream master
3.切换到自己的分支——>(XXX)
git checkout XXX
4.使用merge把主分支的代码合并到自己的分支
git merge master
注意:合并时有可能会有冲突,解决完冲突才能push
5.最后push,你分支的代码就和主分支的一样了
git push origin xxx
删除本地分支
git branch -d xxxxx
查看本地分支与远程分支的映射关系
git branch -vv (注意是两个v)

第一行,本地的jacoco分支,没有和远程分支关联
第二行,本地的master分支,和远程的origin/master分支关联
第三行,本地的v4.7.0分支,和远程的gerrit/jacoco分支关联
其中,远程名字和ahead和behind的意思:
Ahead is the number of commits on this branch that do not exist on the base branch. Behind is the number of commits on the base branch that do not exist on this branch.
当前分支与取消和远程分支关联
git branch --unset-upstream
当前分支与和远程分支关联
git branch -u origin/addFile
或者使用命令:
git branch --set-upstream-to origin/addFile
git remote -v
git remote add upstream git@github.com:xxx/xxx.git(这里还可以填https的地址) 把原项目加入到upstream
如果填错地址,想删除upstream,用git remote rm upstream
git fetch upstream 从原项目拉取最新代码
git merge upstream/master 将源代码最新代码合到fork分支
或者直接拉推特定分支代码到当前分支
git pull upstream Financial-User
git pull origin Financial-User
git push origin Financial-User
如果上一步出错,提示:
error: Your local changes to the following files would be overwritten by merge:
Please, commit your changes or stash them before you can merge.
有两种解决方法,第一, 先commit本地修改,然后合并在push到远程自己的项目。
第二,先执行git stash,然后在执行git merge upstream/master,最后执行git stash pop,把自己的修改又展示出来。
git push 把代码上传到fork项目
最后就是在网页发起pull request请求
另外一种方法就是github网页操作,具体步骤,参考这篇文章
同步master代码到feature分支
#1 创建功能分支
(master) git checkout -b feature
#2 功能迭代
(feature) git commit ...
#3 合并最新主干代码
(feature) git checkout master
(master) git pull orgin master
(master) git checkout feature ####把feature合并到master
(feature) git merge master
gitlab常见操作
git pull upstream master 本地分支拉取最新master代码
git branch -a
git checkout xxx
git remote -v
git pull upstream Financial-User
忽略文件设置
.gitignore
文件位置就在项目根目录
exclude
git 还提供了另一种 exclude 的方式来完成同样的忽略
不同的是 .gitignore 这个文件本身会push到库中去。保存的是公共的需要排除的文件。
而exclude 是自己本地忽略的设置,不会影响到其他人,也不会提交到库中去。
exclude 文件所在位置
项目根目录/.git/info/exclude
git fetch -这里会把所有新分支拉下来 否则在 git branch -r看不到开发新建的分支
git check out 分支名 就自动切到新分支了 代码也是分支代码
如果报错
error: The following untracked working tree files would be overwritten by checkout:
remit-manager.iml
Please move or remove them before you switch branches.
Aborting
就执行git clean -df remit-manager.iml
然后再执行checkout
查看冲突文件列表
git diff --name-only --diff-filter=U
【Git】pull 分支报错 fatal: Need to specify how to reconcile divergent branches
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我
我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam
关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec
我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co