1. 关于远程仓库的一些操作
1.1 添加远程仓库
$ git remote add <shortname> <url>
$ git remote add pd https://xxx/git
不指定name的话,就是默认的origin,这就是对应远程仓库的你设置的名字。
1.2 查看远程仓库
$ git remote -v
pd https://github.com/cho45/grit (fetch)
pd https://github.com/cho45/grit (push)
origin https://github.com/xxx/Temp_python.git (fetch)
origin https://github.com/xxx/Temp_python.git (push)
这里的pd就是对应远程仓库的你设置的简写。
可以指定你要查看的远程库,更详细。
git remote show origin
* remote origin
Fetch URL: https://github.com/1358304569/Temp_python.git
Push URL: https://github.com/1358304569/Temp_python.git
HEAD branch: master
Remote branches:
SRCC new (next fetch will store in remotes/origin)
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (local out of date)
1.3 移除与重命名
比如将pd重命名问paul
$ git remote rename pb paul
$ git remote rm paul
1.4 推送到远程仓库
$ git push [remote-name] [branch-name]
git push <远程主机名> <远程分支名>: <本地分支名>
例如 git push origin dev:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应dev分支
1.5 关于fetch 和 pull
$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
* [new branch] master -> pb/master
* [new branch] ticgit -> pb/ticgit
这里可以看到,fetch以后,就把当前的操作库和分支转到你所fetch的库上面去了。
必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
但是运行git pull
通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
2. 几种撤销操作
2.1 commit后发现有遗漏文件,或者要修改提交信息,而不改变刚保存的文件快照
# 提交文件
$ git commit -m "xxx"
# 发现有遗漏文件,添加进去
$ git add other_file
# 提交时可以看到上一次的提交信息,修改后回覆盖掉。但不改变已提交的文件快照
$ git commit --amend
2.2 撤销暂存区中的某个文件
假如你修改了两个文件,file_A和file_B,打算分开提交,却不小心使用了git add *
,这时两个文件都在暂存区了,咋样把其中一个去掉呢?
$ git reset HEAD file_B
这样file_B的就是modified,而不是staged了。
2.3 撤销对文件的修改
刚才从暂存区把file_B文件撤了下来,然后我就后悔修改它了,想它回到原来的样子。
$ git chenkout -- file_B
ok,乖乖呆着吧。
2.4 将特定文件回滚到特定版本
3. 关于SSH
参考来源
官网 Connecting to GitHub with SSH
3.1 查看是否存在SSH公钥
在桌面打开git bash,输入
ls -al ~/.ssh
公钥类型可能是以下几种形式之一:
id_dsa.pub
id_ecdsa.pub
id_ed25519.pub
id_rsa.pub
3.2
问题记录
1. 由于上传的文件太大导致push失败的问题
- 来源:
在git管理中,不小心把数据文件(大于100M)也放在了git文件夹中,并且已经commit了,进行push时就会失败。 - 解决方法:
删除带有大文件的commit版本,也就是Git 删除具体某个提交commit的方法。但这个方法有风险,它在最后使用的语句是
git push origin master –-force
这可能会导致你原先的commit记录全部被覆盖掉,就只剩下你当前本地库的,上次push之后到这次push之间的commit记录,甚至,可能就只剩下唯一一个commit记录了,前面的都丢失了。(别问我咋知道的,惨痛的经历。。。)
- 你以为就给你剩一个commit就结束了,too young too simple,问题才刚刚开始。。。
1.1 问题刚刚开始
前面使用了
git rebase -i commit_id
这时,你会发现,本来git的界面后面都是显示(master)
分支的,这下显示了一个莫名其妙的分支,图我已经失去了,但记忆深刻,变成了(mastet | rebase-i 2/2)
,就是下图这个位置,这里代表你正在使用的分支:
这就很不懂了,我捣鼓半天,也也能把这个分支弄明白,要是有知道的同学,还麻烦告知一声,那咋办呢。
1.2 简单粗暴没有用
我就简单暴力的,直接把当前的.git文件夹删掉了,重新初始化git init
,然后再重新和远程库进行连接。
git remote add origin http://xxx
没有错误提示,似乎看到了胜利的希望,然后我就add,成功,我commit,成功,我push,成…成傻逼了:
这也看不懂啊,看这个提示,在push之前,先pull,好嘞,咱来pull。
1.3 提示都是骗人的
我听它的,来pull,结果告诉我当前分支没有正在tracking的分支,也就是说,我本地连个树枝都没有,你远程那颗大树想靠过来都没法靠啊,不过这里又有一句提示了:想要tracking当前分支,就用下面这个语句,行,紧跟提示步伐。
用了那个莫名其妙的语句,果然是成功track了,似乎可以push了,然…而,好吧,我再pull。
刚才跟我说没有树枝,现在告诉我该树枝拒绝接受外来不相关人员。。。去查了一下,可以强行放行,下面语句:
git pull origin master --allow-unrelated-histories
看到这一大堆跳动的字符,真开心,没报错就是好的。
1.4 胜利就在前方
上面执行完后,最后一句说automatic merge failed
,我慌了,我滴老天爷啊,求放过。我小心翼翼的尝试一下pull,自己来merge,提示:
行吧,感觉这一大圈下来,是git溜我呢,查了一下,说这就是本地还没commit文件,那我前面push失败,是哪来的commit文件,好吧,1234,再来一次
哇撒,成成功了,这下可以放心的去继续修改代码了。这一场战役over。
1.5 历史遗留问题
虽然问题暂时解决了,中间还是有几个不明白地方,比如
- rebase到底怎么什么用处,使用场景?
- 本地库/远程库,本地分支/远程分支概念界限不清
2. add file时出现fatal: Not a git repository (or any of the parent directories): .git错误
原因是没有进行git init,导致没有生成.git隐藏文件夹。
3. 新建分支时,出现fatal: Not a valid object name: 'master’错误
原因是没有提交一个对象,要先经过add``commit等操作后才会真正建立master分支,此时才可以建立其他分支。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
$ git push origin branchname
在本地仓库提交后推送到远程仓库
作者:Cloud_9527
链接:https://www.jianshu.com/p/0995b062396c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
4. 在将本地分支推送到远程库时,出现fatal: TaskCanceledException encountered
原因未知,执行下列语句可以解决:
$ git config --global credential.helper manager
5. 在git commit 编辑title和description后,按Esc键后未推出编辑器
今天用git commit -m “注释”提交的时候,注释写错了。
首先 使用 git commit --amend 命令,(修改最近一次提交的注释信息),会进入到vim 编辑器,然后 你会发现编辑器里你怎么输入都没反应,这是因为vim处在不可编辑状态,按下字母键 c,此时进入编辑状态,可以开始修改注释信息了。
在然后 你会发现你怎么都退出不了,回到shell了,然后操作如下: ESC --》 退出编辑状态;接着 连续按两次大写字母键 Z,接着你会惊喜的发现,终于保存好退出来了!
windows 系统 ,亲测有效!!拿走不谢!
来源:月下小狸123的博客园
5.2 commit补充:在windows下的commit默认编辑器是,是TM啥啊,我也不知道,但是,打开Git CMD通过下面语句将其改为vim
$ git config --global core.editor vim,
以后就不会编辑后不知道咋退出啦。
6. git提示modified:xxx(modified content, untracted content)
原因:目录没有被跟踪;
解决:删除xxx目录下的.git文件夹即可继续操作
7. pull时提示The authenticity of host ‘github.com (xx.xx.xx.xx)’ can’t be estabilished
因为默认是用HTTPS连接远程库和本地库,但git的连接方式有两种,还可以用ssh连接,我就手欠的试了一下ssh连接方式
右上角切换连接方式(Use HTTPS)
就会出现以下错误
The authenticity of host ‘github.com (52.xx.xxx.119)’ can’t be established.RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? //yes
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
解决方案:需要进行git ssh 配置,登录github,进入要pull的项目中的setting,点击Deploy keys,将本地的ssh 公钥添加进去,即可。
现在知道这是干嘛的了,so,以后还是老老实实用HTTPS吧。
8. git 进行remote add时,提示 fatal: remote origin already exists
解决:先进行 git remote rm origin,再添加即可
9. push时提示:
Fatal: TaskCanceledException encountered.
-
在本次操作中,可能是包含大文件导致的
-
先进行以下操作
git config --global credential.helper manager
10. push时提示:You are not currently on a branch
解决办法:git checkout master
11.提示failed to push some refs to ‘xxx’
这一次,我是觉得文件层次不太好,就在本地将子模块单独放在了一个文件夹,然后push到github上,但是github只添加和更新,却不会和我一样,删掉多余的重复的文件,我一时脑子瓦特了,就在github手动给删了,将文件目录层次弄的和本地一样, 就没管了。
过了几天,改了代码,push时却失败了,才想起来,上次在远程库操作了,没重新pull到本地,也就是在操作记录上,本地和远程的记录不一样啊。
那就先来pull吧。
可是我这边代码已经改了好多了,合并也不顺利啊,去查了一下,有个语句:
$ git pull origin master --allow-unrelated-historied
使用这个语句,目前发现毫无问题的合并了,接下来可以接着干了。
12. 如何删除已经commit的版本中间某个特定版本
参考这篇博文Git 删除具体某个提交commit的方法
13. 执行git add . 后仍然报changes not staged for commit错误
参考来源:
执行git add . 后仍然报changes not staged for commit错误的解决方法
git官方文档——7.11 Git Tools - Submodules
在git时,执行git add . ,commit,push
一气呵成后,发现远程库中,有个文件夹只有名字,无法打开,再回本地仓库执行一下git status
发现,提示这个文件夹(图片来自参考,但提示内容是一样的):
还以为自己健忘症,忘了执行 add操作,但是一二三四 再来一次后发现,还是这样。
然后就留心了一下git提示,发现:
看到了吧,意思就是该子文件夹下,还有一个git仓库,所以该文件夹内容不会添加和显示。。。
至于要怎么解决,可以参考第二个参考来源,git 官方文档中好像说了submodule的用法,时间原因我还没研究,就直接新建一个本地库,从远程库pull下来后,删除这个文件夹,再repush了,暂时就不要这个了,后面研究了再来更新~~~
14. git branch -a 并没有显示所有的远程分支
因为本地仓库和远程仓库本质上时完全独立的,想在本地看见远程仓库的信息就应该fetch一下远程的信息。
查看本地分支:git branch
查看远程分支:git branch -r
查看所有分支(包括远程和本地):git branch -a
15. git pull时的merge conflict 解决步骤
在git pull 时,特别是在进行版本回退 reset 操作后,再进行 pull 操作就很容易出现 merge conflict 冲突,一般是这样的:
(假装有图哈哈哈)
就是很明显的进入了merging
状态,一时不知道咋办了。
常规步骤就是:
- 在本地打开代码,找到冲突的地方,手动修改;
- 然后再进行 git add .,commit 操作,此时就可以看到merging状态已经没了;
- ok,可以正常操作了,push 或者继续码农。
16. git push时提示fatal: AggregateException encountered.,然后接着 Please make sure you have the correct access rights and the repository exists.
参考:
解决git push时每次都要输入Github用户名和密码的问题
git遇到的问题之“Please make sure you have the correct access rights and the repository exists.”
- 问题出现
在一台新设备上,给自己的github账号添加了SSH-key后,习惯性的就开始git clone啊,add、commit,然后push的时候就提示了:
$ git push origin master
fatal: AggregateException encountered.
One or more errors occurred.
Username for 'https://github.com':
17. Connection reset by xxx port 22 fatal: Could not read from remote repository.
完美解决了我的问题啊啊啊啊啊啊啊