- 需求1:小项目放在github上一般流程如下
- 需求2:参与github开源项目提交pull-request
- 需求3:撤销与还原commit
- 需求4:
remote origin already exists - 需求5:
Permission denied (publickey). - 需求6:
failed to push som refs to - 需求7:
RPC failed - 需求8
需求1:小项目放在github上,一般流程如下: < Back to 目录
-
新建一个repository
-
在本地目录下打开命令行,输入
git clone https://github.com/LinXueyuanStdio/learnGit以本项目为例,直接在git clone后加上网址即可。clone完成后会得到一个learnGit文件夹 -
继续输入
cd learnGit进入项目文件夹 -
把需要上传的文件粘贴到learnGit文件夹内,使用
git add file将新文件加入缓存区 -
echo "ss" >> file(非必须)该命令意思是给文件名为file的文件写入字符串ss. -
git status查看git add之后和之前的文件差异状态 -
git commit -m "new file"确定提交刚刚add后的文件,-m "new file"意思是本次提交所做的修改的简要介绍,m是message的缩写 -
git push -u origin master向github服务器推送git commit 后的文件,流程完毕
需求2:参与github开源项目,提交pull request: < Back to 目录
- fork原始仓库
以此项目为例:https://github.com/lzjqsdd/scikit-learn-doc-cn 右上角有个fork,点击fork到自己的仓库
-
clone 自己的仓库:
git clone https://github.com/LinXueyuanStdio/scikit-learn-doc-cn到本地。这个项目就是上面所说的项目拷贝。 -
在 master 分支添加原始仓库为远程分支:
git remote add upstream https://github.com/lzjqsdd/scikit-learn-doc-cn. -
如果fork的项目有更新怎么办呢?如果重新再fork这个项目的话,自然也是没有问题的,只不过这样是不是有点太low了
解决方式是:
-
拉取远程分支:
git fetch upstream. -
切换到想要更新的目录,合并分支:
git merge upstream/master// 把远程分支的master分支合并到当前分支,这样远程项目中的修改就合并到了本地。
- 自己分支开发,如 dev 分支开发:
git checkout -b dev.
- 本地 dev 提交
-
git add *. -
git commit -m "update".
- 切换 master 分支,同步原始仓库:
-
git checkout master. -
git pull upstream master.
- 切换本地 dev 分支,合并本地 master 分支(已经和原始仓库同步),可能需要解冲突
-
git checkout dev. -
git merge master.
- 提交本地 dev 分支到自己的远程 dev 仓库
git push origin dev.
- 现在才是给原始仓库发 pull request 请求,等待原作者回复(接受/拒绝)
到原始仓库页面,这时右边多出一个commit pull request按钮,点击,填写改动信息,完啦。
- (附)删除分支
git push origin :dev# 删除远程dev分支,危险命令哦
git checkout master# 切换到master分支git branch -d dev# 删除本地dev分支
- (附)查看所有分支
git branch --all.
需求3:撤销与还原commit: < Back to 目录
撤销commit有很多方法,个人比较推荐用 reset 或 rebase -i,底下将会同时介绍 revert 和 reset 的方法。 commit 如下
A -> B -> C -> D -> E想要还原到 commit C 之后的状态 (也就是把 D 和 E 回退)
revert用:
git revert E
git revert D结果:
A -> B -> C -> D -> E -> F -> GF 是还原 commit E 修改结果的 commit
G 是还原 commit D 修改结果的 commit
因此,revert 只会让 commit 继续往前
优点是可以针对某个 commit 进行还原,并且留下还原记录
rebase -i
假如想要抽掉某个 commit 又不想留下记录, rebase -i 就很好用了
假如只想要还原 D 变成:
A -> B -> C -> E则用命令
git rebase -i C这时候会出现文字编辑
pick D xxx
pick E ooo把 pick D xxx 整列移除后储存就可以了,若中间有遇到冲突,则必须自行修正后再继续
git add .
git rebase --continue- reset 用于做整段 commits 的还原
例如希望还原到 B commit 以后的状态变成
A -> B则
git reset B那么 git 会将 log 中的 C, D, E 都清除
但档案内容没有任何变动,因此会看到 C, D, E 修改的档案处在 unstaged 阶段
若针对部分档案还原可以用
git checkout [file path]若要全部还原可用
git checkout -f- 结论
还没
push前,个人倾向不产生太多commit。因此我都会用rebase -i进行编修, 顺便合并或reword一些commit
某个特殊情况, 例如发现某个 commit 里面包含了不相干的档案, 欲重新 commit 时,就会先用 rebase -i 把欲修改的 commit 换到后面(较新), 然后再用 reset 重新 stage + commit。
需求4:remote origin already exists. < Back to 目录
如果输入$ git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git
提示出错信息:fatal: remote origin already exists.
解决办法如下:
- 先输入
$ git remote rm origin - 再输入
$ git remote add origin git@github.com:djqiang/gitdemo.git就不会报错了! - 如果输入
$ git remote rm origin还是报错的话,error: Could not remove config section ‘remote.origin’.我们需要修改gitconfig文件的内容 - 找到你的
github的安装路径,我的是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_ca477551eeb4aea0e4ae9fcd3358bd96720bb5c8\etc - 找到一个名为
gitconfig的文件,打开它把里面的[remote "origin"]那一行删掉就好了!
需求5:Permission denied (publickey). < Back to 目录
如果输入$ ssh -T git@github.com
出现错误提示:Permission denied (publickey).因为新生成的key不能加入ssh就会导致连接不上github。
解决办法如下:
- 先输入
$ ssh-agent,再输入$ ssh-add ~/.ssh/id_key,这样就可以了。 - 如果还是不行的话,输入
ssh-add ~/.ssh/id_key命令后出现报错Could not open a connection to your authentication agent.解决方法是key用Git Gui的ssh工具生成,这样生成的时候key就直接保存在ssh中了,不需要再ssh-add命令加入了,其它的user,token等配置都用命令行来做。 - 最好检查一下在你复制
id_rsa.pub文件的内容时有没有产生多余的空格或空行,有些编辑器会帮你添加这些的。
需求6:failed to push som refs to < Back to 目录
如果输入$ git push origin master
提示出错信息:error:failed to push som refs to …….
解决办法如下:
- 先输入
$ git pull origin master//先把远程服务器github上面的文件拉下来 - 再输入
$ git push origin master - 如果出现报错
fatal: Couldn’t find remote ref master或者fatal: ‘origin’ does not appear to be a git repository以及fatal: Could not read from remote repository. - 则需要重新输入
$ git remote add origingit@github.com:djqiang/gitdemo.git
需求7:RPC failed < Back to 目录
从 github 执行 git pull 的时候提示 error: RPC failed,如:
error: RPC failed; result=52, HTTP code = 0 fatal: The remote end hung up unexpectedly
应该是pull 内容更新太多,需要设置postBuffer更大些
git config --global http.postBuffer 524288000
套路 < Back to 目录
mkdir ADirectory#本地随意创建一个文件夹
cd ADirectory#进到该目录
git clone git@github.com:username/ADirectory.git#github创建仓库ADirectory之后,把github上的git下载到本地
git remote add origin git@github.com:username/ADirectory.git#github创建hahaha,把本地的库hahaha与github上的git关联
git config --global user.name "ThisIsUserName"#配置用户名和邮箱
git config --global user.email ThisIsUserEmail@email.com .
git init#初始化为本地的仓库
touch readme#新建一个文件
echo something >> readme#随便写入什么东西
git add readme #每次更新都要add,添加到缓冲区
git status #查看状态,查看哪些文件改变了但还未commit
git diff #查看文件改变的内容
git commit - m '1'#提交到本地代码库
git status#再次查看文件改变的内容
git log#查看git的记录
git checkout#撤销操作
git diff#这次本地修改和你上次commit的差别
git status #会提示你add或者checkout
git checkout --file 就能恢复到上次提交的内容.若是add过,git reset HEAD ThisIsAFile就能从缓存区删掉
git push -u origin master#把本地的文件都推上去
git pull#把github的文件都拉下来
最基本的命令 < Back to 目录
git clone 拷贝并跟踪远程的master分支。跟踪的好处是以后可以直接通过pull和push命令来提交或者获取远程最新的代码,而不需要指定远程分支名字。
git submodule init
git submodule update
参考示意图
HEAD 指向当前的commit 对象(可以想象为当前分支的别名),同时也用来表明我们在哪个branch上工作。所以当我们使用HEAD来操作指针的时候,其实就是不改变当前的commit的指向。
显示信息类命令 < Back to 目录
git ls-files -u 显示冲突的文件,-s是显示标记为冲突已解决的文件
git diff 对比工作区和stage文件的差异
git diff --cached 对比stage和branch之间的差异
git branch 列出当前repository下的所有branch
git branch --a 列出local 和remote下的所有branch
git ls-files --stage 检查保存在stage的文件
git log 显示到HEAD所指向的commit为止的所有commit记录 。使用reset HEAD~n 命令使HEAD指针向前移动,会导致HEAD之后的commit记录不会被显示。
git log -g则会查询reflog去查看最近做了哪些动作,这样可以配合git branch 恢复之前因为移动HEAD指针所丢弃的commit对象。如果reflog丢失则可以通过git fsck --full来查看没被引用的commit对象。
git log -p -2 对比最新两次的commit对象
log -1 HEAD
git log --pretty=oneline
git log --stat 1a410e 查看sha1为1a410e的commit对象的记录
git blame -L 12,22 sth.cs 如果你发现自己代码中 的一个方法存在缺陷,你可以用git blame来标注文件,查看那个方法的每一行分别是由谁 在哪一天修改的。下面这个例子使用了-L选项来限制输出范围在第12至22行
创建类命令 < Back to 目录
git brach branchName 创建名为branchName的branch
git checkout branchName 切换到branchName的branch
git checkout -b 创建并切换,也就是上面两个命令的合并
git brach branchName ef71 从commit ef71创建名为branchName的branch
撤销类命令 < Back to 目录
- use "
git reset HEAD <file>..." to unstage
如果已经用add 命令把文件加入stage了,就先需要从stage中撤销,然后再从工作区撤销
- use "
git checkout -- <file>..." to discard changes in working directory
git checkout a.txt 撤销a.txt的变动(工作区上的文件)
1.git chenkout 如果已经commit了,则需要 git commit --amend 来修改,这个只能修改最近上一次的,也就是用一个新的提交来覆盖上一次的提交。因此如果push以后再做这个动作就会有危险
2.$ git reset --hard HEAD 放弃工作区和index的改动,HEAD指针仍然指向当前的commit.这条命令同时还可以用来撤销还没commit的merge,其实原理就是放弃index和工作区的改动,因为没commit的改动只存在于index和工作区中。
$ git reset --hard HEAD^ 用来撤销已经commit的内容(等价于 git reset --hard HEAD~1) 。原理就是放弃工作区和index的改动,同时HEAD指针指向前一个commit对象。
3.git revert 也是撤销命令,区别在于reset是指向原地或者向前移动指针,git revert是创建一个commit来覆盖当前的commit,指针向后移动
提交类命令 < Back to 目录
-
git add跟踪新文件或者已有文件的改动,或者用来解决冲突 -
git commit把文件从stage提交到branch -
git commit -a把修改的文件先提交到stage,然后再从stash提交到branch
[(本地工作目录)--add-->(缓存区)--commit-->(本地的git库)] ——-push———>(github)
删除类命令 < Back to 目录
-
git rm --cached readme.txt只从stage中删除,保留物理文件 -
git rm readme.txt不但从stage中删除,同时删除物理文件 -
git mv a.txt b.txt把a.txt改名为b.txt
Merge类命令 < Back to 目录
在冲突状态下,需要解决冲突的文件会从index打回到工作区。
-
用工具或者手工解决冲突
-
git add 命令来表明冲突已经解决。
-
再次commit 已解决冲突的文件。
$ git reset --hard ORIG_HEAD 用来撤销已经commit 的merge.
$ git reset --hard HEAD 用来撤销还没commit 的merge,其实原理就是放弃index和工作区的改动。
git reset --merge ORIG_HEAD,注意其中的--hard 换成了 --merge,这样就可以避免在回滚时清除working tree。
Git 常用命令 < Back to 目录
远程仓库相关命令 < Back to 目录
-
检出仓库:
$ 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分支
分支(branch)操作相关命令 < Back to 目录
-
查看本地分支:
$ git branch -
查看远程分支:
$ git branch -r -
创建本地分支:
$ git branch [name]----注意新分支创建后不会自动切换为当前分支 -
切换分支:
$ git checkout [name] -
创建新分支并立即切换到新分支:
$ git checkout -b [name] -
删除分支:
$ git branch -d [name]---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项 -
合并分支:
$ git merge [name]----将名称为[name]的分支与当前分支合并 -
创建远程分支(本地分支push到远程):
$ git push origin [name] -
删除远程分支:
$ git push origin :heads/[name]或$ gitpush origin :[name]
*创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)
$git symbolic-ref HEAD refs/heads/[name]
$rm .git/index
$git clean -fdx
版本(tag)操作相关命令 < Back to 目录
-
查看版本:
$ 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'
子模块(submodule)相关操作命令 < Back to 目录
- 添加子模块:
$ 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步走哦)
-
$ git rm --cached [path] -
编辑
“.gitmodules”文件,将子模块的相关配置节点删除掉 -
编辑
“ .git/config”文件,将子模块的相关配置节点删除掉 -
手动删除子模块残留的目录
5)忽略一些文件、文件夹不提交 在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如
target
bin
*.db