Clone项目
克隆
git clone https://github.com/psvmc/RESideMenu_Swift.git ../RESideMenu_Swift
克隆分支
git clone -b 分支名 https://github.com/psvmc/RESideMenu_Swift.git ../RESideMenu_Swift
克隆下来的项目git的配置信息也下载下来了,所以不用
git init
第一次提交
- 进入项目的根目录
cd /xx/xx
- git初始化
git init
- 添加远程库
git remote add origin https://github.com/psvmc/RESideMenu_Swift.git
- 输入账号密码
- 添加修改的文件
git add .
- 提交已添加的文件
git commit -m "注释信息"
- 修改push到远程
git push origin master
Git拉取
1 | git pull <远程主机名> <远程主机分支名>:<本地分支名> |
比如 取回origin
主机的next
分支,与本地的master
分支合并,需要写成下面这样
1 | git pull origin next:master |
拉取远程指定分支
1 | git fetch origin 分支名称 |
git fetch 和git pull 的差别
git fetch 相当于是从远程获取最新到本地,不会自动merge
git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
git log -p master ..origin/master //比较本地的master分支和origin/master分支的差别
git merge origin/master //进行合并git pull:相当于是从远程获取最新版本并merge到本地
git pull origin master
git pull <远程主机名> <远程分支名>:<本地分支名>
取消SSL验证
修改git的配置文件,设置http.sslVerify为false,即可关闭TLS证书验证:
1 | git config --global http.sslverify false |
如果您仍然想要进行TLS证书验证,但是不想看到警告信息,可以使用以下命令来关闭Git的警告信息:
1 | git config --global advice.detachedHead false |
Git提交方式
- 进入项目的根目录
cd /xx/xx
- 把远程的pull过来
git pull origin master
- 修改文件
- 添加修改的文件
git add .
- 提交已添加的文件
git commit -m "注释信息"
- 修改push到远程
git push origin master
1 | git push <远程主机名> <本地分支名>:<远程主机分支名> |
比如 把本地的master
分支推送到远程my_master
1 | git push origin master:my_master |
修改提交的备注
1 | git commit --amend |
提交记录
查看某人的提交历史
1 | git log --author=“psvmc” |
所有的提交历史
1 | git log --date=iso --pretty=format:’"%h","%an","%ad","%s"’ >> D:\git_log\schoolweb.csv |
某段时间历史
时间正序
1 | git log --after="2022-2-1" --before="2022-12-31" --date=short --reverse --pretty=format:"%h","%an","%ad","%s" >> D:\git_log\schoolweb.csv |
时间倒序
1 | git log --after="2022-2-1" --date=iso --pretty=format:"%h","%an","%ad","%s" >> D:\git_log\schoolweb.csv |
Git分支
- 添加本地分支
git branch <新分支名字>
- 切换本地分支
git checkout <分支名>
该语句和上一个语句可以和起来用一个语句表示:git checkout -b <分支名>
- 添加/推送远程分支
git push origin <本地分支>:<远程分支>
- 查看本地分支
git branch
- 查看远程分支
git branch -a
- 删除本地分支
git branch -d <本地分支>
- 删除远程分支
git push origin :<远程端分支>
- 分支合并
比如,如果要将开发中的分支(develop
),合并到稳定分支(master
),
首先切换的master
分支:git checkout master
。
然后执行合并操作:git merge develop
。
如果有冲突,会提示你,调用git status
查看冲突文件。
解决冲突,然后调用git add
或git rm
将解决后的文件暂存。
所有冲突解决后,git commit
提交更改。 - 分支衍合
分支衍合和分支合并的差别在于,分支衍合不会保留合并的日志,不留痕迹,而 分支合并则会保留合并的日志。
要将开发中的分支(develop
),衍合到稳定分支(master
)。
首先切换的master
分支:git checkout master
。
然后执行衍和操作:git rebase develop
。
如果有冲突,会提示你,调用git status
查看冲突文件。
解决冲突,然后调用git add
或git rm
将解决后的文件暂存。
所有冲突解决后,git rebase --continue
提交更改。
Tag操作
git跟其它版本控制系统一样,可以打标签(tag), 作用是标记一个点为一个版本号,打标签的操作发生在我们commit修改到本地仓库之后
添加标签
1 | git add . |
上传标签
1 | git push origin master |
--tags
参数表示提交所有tag至服务器
普通的git push origin master
操作不会推送标签到服务器端
删除本地标签
1 | git tag -d 1.0 |
删除远程标签
1 | git push origin :refs/tags/1.0 |
冲突解决(MyEclipse)
- 提交至本地库
commit
- 进行同步
Synchronize Workspace
- 从远程pull下来
pull
- 利用
Merge Tool
- 选择第二项
Use HEAD(the last local version) of conflicting files
- 手动解决冲突
- 添加到git index中
Add to Git index
- 提交并推送
commit and push
冲突解决(命令)
- 备份当前分支
git branch master_backup
- 还原
git reset --hard dca9073
本地覆盖远程
1 | git push origin master:master --force |
远程覆盖本地
1 | git fetch --all |
设置用户名与邮箱
设置
git config --global user.name "psvmc"
git config --global user.email "183518918@qq.com"
查看
git config --get user.name
git config --get user.email
禁止提交文件
加入我们在配置.gitignore
文件之前就提交了123.txt
那么即使我们以后.gitignore
中添加上123.txt
该文件依旧会被提交,该怎样解决呢
正确的做法
先移除追踪
1 | git rm --cached 123.txt |
在提交
1 | git commit -m "移除追踪" |
错误的做法
1 | git update-index --assume-unchanged <PATH> |
这样做虽然能达到(暂时的)目的,但并非最正确的做法,这样做是误解了 git update-index
的含义,而且这样做带来的最直接(不良)后果是这样的:
所有的团队成员都必须对目标文件执行:
git update-index --assume-unchanged <PATH>
。这是因为即使你让Git
假装看不见目标文件的改变,但文件本身还是在Git
的历史记录里的,所以团队的每个人在fetch
的时候都会拉到目标文件的变更。(但实际上目标文件是根本不想被Git
记录的,而不是假装看不见它发生了改变)一旦有人改变目标文件之后没有
git update-index --assume-unchanged <PATH>
就直接push
了,那么接下来所有拉取了最新代码的成员必须重新执行update-index
,否则Git
又会开始记录目标文件的变化。这一点实际上很常见的,比如说某成员换了机器或者硬盘,重新clone
了一份代码库,由于目标文件还在Git
的历史记录里,所以他/她很可能会忘记update-index
。
如果你修改的一个文件很大,那么你的每一次修改git都保存历史的话,是很慢的所以git update-index --assume-unchanged
的真正用法是这样的:
- 你正在修改一个巨大的文件,你先对其
git update-index --assume-unchanged
,这样Git
暂时不会理睬你对文件做的修改; - 当你的工作告一段落决定可以提交的时候,重置改标识:
git update-index --no-assume-unchanged
,于是Git
只需要做一次更新,这是完全可以接受的了; - 提交+推送。
改写历史
1 | git clone https://github.com/psvmc/psvmc.github.io.git |
注意 这也会对当前的分支进行操作
也就是说 上述的例子也会删除当前分支的图片
如果只想删除历史文件 就要当前的文件先备份一下
删除的文件夹中包含文件夹
例如 删除.idea
文件夹
1 | git filter-branch --tree-filter 'rm -rf .idea/*' --tag-name-filter cat -- --all |
取消跟踪已版本控制的文件
不再追踪文件改动
1 | git update-index --assume-unchanged filePath |
恢复追踪文件改动
1 | git update-index —no-assume-unchanged filePath |
删除被管理的文件
1 | git rm —cached filePath |
删除被管理的文件夹
1 | git rm -rf —cached filePath |
无法Clone
当项目过大时会报一下的错误
1 | RPC failed; curl 18 transfer closed with outstanding read data remaining |
解决方法
1 | git config --global http.postBuffer 24288000 |
如果还不行呢
1 | git clone http://github.com/myproject --depth 1 |
如果上面的还不行 就可能是Nginx做代理缓存设置过小的缘故
把代理中的缓存关闭就行了(折腾了好久,才试出来的)
1 | location / { |
版本回退
查看之前的版本
1 | git reflog |
复制完要会退的版本号后 按q
键退出
回退到指定版本
- git reset –soft xxxx
- git reset –hard xxxx
回退到上个版本
git reset –soft HEAD~1
git reset –hard HEAD~1
HEAD就代表当前,所以上一个版本其实就是当前-1
前者表示只是改变了HEAD的指向,本地代码不会变化,我们使用git status依然可以看到,同时也可以git commit提交。
后者直接回改变本地源码,不仅仅指向变化了,代码也回到了那个版本时的代码,所以使用是一定要小心,想清楚。
常见问题
问题1
fatal: bad object refs/remotes/origin/master
解决方法
1 | mv .git/refs/remotes/origin/master /tmp |
Git每次提交都要输入url
当代码不是clone
下来,而是本地分享到git,以后每次push
都需要输入url,
原因在于生成的config
文件中不包含远程git的信息
解决方法:
- 打开项目下
.git
文件夹,找到config
文件,打开 - 替换内容为以下
1 | [core] |
- 修改url为你git仓库的url
修改ssh key后一直验证不通过
修改ssh key后一直验证不通过,本地也生成key了,也在github或coding.net上添加过key了,就是验证不通过
经过好长时间测试发现,发现验证ssh key的机制是这样的
当第一次进行验证时,会把ssh key读取出来并放入内存中,在其存活的期间内,则一直从内存中读取
所以解决方法就是让其重新读取新生成的key,可以重新启动myeclipse,不行的话,重启电脑是一定行的!
客户端推荐
Sourcetree
强烈推荐最好用的客户端 免费使用。
https://www.sourcetreeapp.com/
Fork
也挺好用的 不付费也没有功能限制。
其中搜索项目的功能特别好用
链接:https://pan.baidu.com/s/1wjlq9qEtiw_V7HEKMGdcPw
提取码:psvm
如图
GitHub Desktop
没有提交的历史树状节点展示,多人协作的时候不是很方便,适合个人项目使用。
链接:https://pan.baidu.com/s/1FI6jw6O9nd9AGtS8t50mNg
提取码:psvm
Github提交失败
先查看系统的代理
设置git代理
1 | git config --global http.proxy http://127.0.0.1:1080 |
取消代理
1 | # 取消代理 |