Git的常用总结
命令行中使用
1、开发代码初建
clone远程仓库到本地:git clone 项目的git地址url ,也可以指定分支:git clone -b v1.2 xxxx
新建本地分支v1.0.0:git branch v1.0.0
然后push到远程仓库,git push –u origin v1.0.0
其它开发者,拉取远程仓库
#将远程git仓库中v1.0.0拉取到本地(本地一开始不存在)只做一次
Git checkout –b v1.0.0 origin/v1.0.0
如果出现提示:
fatal: Cannot update paths and switch to branch 'dev2' at the same time.
Did you intend to checkout 'origin/dev2' which can not be resolved as commit?
表示拉取不成功。我们需要先执行 git fetch
再执行上面命令
【Git fetch将某个远程主机的更新,全部取回本地。默认情况下,git fetch
取回所有分支的更新。】
2、代码提交
2.1、分支管理命令
- 本地分支
#查看所有分支 git branch –a
#新建开发分支 git branch v1.0.0-hy-20170505-1
#转到开发分支 git checkout v1.0.0-hy-20170505-1
上两条命令可以合并为一条:git checkout –b v1.0.0-hy-20170505-1
注:若切换分支不成功,则在后面加 –f (代表强制执行)
《两个分支,git会管理两份代码,切换到哪分支就是哪份代码》
#删除本地分支 git branch -D v1.0.0-hy-20170506-1
- 远程分支
# 查看远程分支:git branch –r
# 删除远程分支 :git push origin –-delete v1.0.1.6
# 本地没有远程的分支,则拉取远程分支
方法一:git fetch origin 远程分支名x:本地分支名x
使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。
方法二:git checkout -b 本地分支名x origin/远程分支名x
使用该方式会在本地新建分支x,并自动切换到该本地分支x。
2.2、开发完,提交,拉取
开发完成后先提交代码到本地(未提交代码到本地,切勿切换分支)
- Git status
- Git add .
- Git commit –m ‘[修改内容]视频处理相关的代码整合’
修改内容 参考模板:
[提交类型] 后台逻辑解耦
[相关单号]
[修改分析] 逻辑重新设计
[修改内容] 各检测方式模块化,与融合、推送隔开
[后续事项] 各模块重构、优化
[提醒备注]
#切换到v1.0.0,#切换到分支 git checkout v1.0.0
#从远程拉取最新的v1.0.0 Git pull (origin v1.0.0)
Pull
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
$ git pull <远程主机名> <远程分支名>:<本地分支名>
比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
$ git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin next
2.3、合并【非必须】
# 开发修改代码后,将开发分支与本地v1.0.0(这个分支应该是同远程分支,别人有改动的话就pull一次)合并
git checkout v1.0.0 #切换到分支
Git merge v1.0.0-hy-20170505-1
出现【On branch v1.0.0 Your branch is ahead of 'origin/v1.0.0' by 1 commit.】
# 编译,看大伙的修改是否获取到,编译调试、功能是否正确。
2.4、推送
#将本地v1.0.0 推送到远程v1.0.0分支 Git push
不带任何参数的git push,默认只推送当前分支
(git push origin v1.0.1:v1.0.1)
注:前一个v1.0.1必须为你本地存在的分支,后一个v1.0.1为远程分支,如果远程v1.0.1不存在则会自动创建分支。
(git push origin v1.0.1) 将本地分支v1.0.1 推送到origin主机的对应分支。
2.5、代码还原
参考:git怎样还原所有修改
如果是修改的代码尚未提交,
git checkout -- aaa.html // 指定还原`aaa.html`文件 git checkout -- * // 还原所有文件
VS中 使用
1、克隆远程仓库已有分支
当作为一个新成员参与别人已经建好的项目中,此时远程已经有有一些分支了。
1、克隆
从远程下载代码步骤如下:打开VS,切换到“团队资源管理器”,点上方“主页”右侧的下拉三角,选择项目->连接到团队项目,然后选择“克隆”,填入Git的Remote Url和要克隆到的本地目录(该目录必须为空),然后点克隆按钮即可将项目克隆到本地。
2、本地拉取远程的一个新分支
只需单击同步里面的 提取。
常见名词解释
拉取(Pull):将远程版本库合并到本地版本库,相当于(Fetch+Meger)
获取/提取(Fetch):从远程版本库获得最新版本
合并(Meger):将两个版本库进行合并操作
提交(Commit):将所做的更改,存入本地暂存库
推送(Push):将所做的更改,存入远程版本库
同步(Pull+Push):先将远程库拉取,再将本地库推送到远程库,相当于(Pull+Push)
变基到(Switch):切换分支(双击即可切换)
git pull 从远程拉取最新版本 到本地 自动合并 merge git pull origin master。。即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。
git fetch 从远程获取最新版本 到本地 不会自动合并 merge git fetch origin master git log -p master ../origin/master git merge orgin/master
实际使用中 使用git fetch 更安全 在merge之前可以看清楚 更新情况 再决定是否合并
2、初建项目并push到github上
1、若先在远程GitHub创建苍仓库
在远程Github等服务器新建一个空Repositories,这里起名GitTest。
打开VS2013,新建项目GitTestProject,右键单击解决方案,选择“将解决方案添加到源代码管理器”,选择Git
同步,推送到远程仓库
注:若没有的这个选项话,也可以用git bash去操作:
连接远程仓库,在本地的命令框中输入下面的命令,即连接到了名为poster的仓库上
git remote add origin https://github.com/xxxx/yyy.git
把本地项目推送到远程仓库:
git push -u origin master
2、远程GitHub不先创建仓库
打开VS2019,新建项目GitTestProject,右键单击解决方案,选择“将解决方案添加到源代码管理器”,选择Git
同步-》push to GitHub-》登录账户
登录成功后,直接点Publish
3、提交代码
暂存想提交的文件,不想提交的右键暂存。提交临时文件,拉取再推送。
有冲突时,可以点击冲突,然后对比文件,选择使用远程的代码还是本地代码,然后再次提交。
4、忽略文件
把某些目录或文件加入忽略规则,后发现并未生效,原因是.gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
那么解决方法是先把本地缓存删除:
git rm -r --cached .
将本地代码重新加入
git add .
不想提交的文件,最好一开始提交 之时 就不要提交到远程。
5、还原修改
如果提交了一次代码到远程,然后发现想撤销上次提交,即想要还原修改,转到修改还原的代码处,单击方法引用处的
在右侧即可点还原操作。然后单击同步,进行同步到远程即可。
若想对还原的修改撤回,则对还原的那次提交 邮件点击 还原 即可。
git提交日志导出为文件
可以使用git bash工具,利用git log命令导出
在项目根目录下执行命令,导出 git 提交记录到根目录:【注意命令中的符号要英文状态下的】
git log --pretty=format:'"%ai", "%an","%s"' --since="100 day ago" >> log.csv
上述命令时指定时间从100天开始的:--since="100 day ago"
如果想导出某些提交者的提交记录,可以用 grep过滤,比如我想导出「hy」这个人在项目中的提交记录:
git log --pretty=format:'"%ai", "%an","%s"' --since="100 day ago" | grep hy >> log.csv
更多参考:git log 的使用
附:导出的CSV为乱码格式问题
EXCEL打开的CSV文件默认是ANSI编码,如果CSV文件的编码方式为utf-8、Unicode等编码可能就会出现文件乱码的情况。
解决方法:
使用记事本打开CSV文件。点击菜单:文件-另存为,编码方式选择ANSI。保存完毕后,再用EXCEL打开这个文件就不会出现乱码的情况。
若csv编辑后保存不生效,可以将csv打开后,全部复制到一个新的excel表格中进行编辑。
常见问题
1、Git Push Error: dst refspec xxxx(分支号) matches more than one.
最近工作中遇到这样的问题,使用的是Git做版本控制,在PUSH代码的时候,出现如下错误:
- error: dst refspec XXX matches more than one.
- error: failed to push some refs to 'git@xxx.xx:xxx.git'
初步一看,还想,怎么可能,出现两个相同的分支?表示很不解。
查看Git服务器上的分支也只有一个指定名称的分支,最后无意间发现服务器上有一个和分支名称相同的tag,按照项目组的习惯,tag一般都是以时间作为名称的,这里怎么会出现这个,好奇中删掉它重试,果然,Git把tag和分支搞在一起了,tag名称不能和分支名称完全相同,不知道这是Git个别版本的bug还是就这样机制。
2、git中进入带有空格的目录下的解决办法
比如,要进入Program Files目录下,有两种方法:
- 将Program Files目录用引号引起来。
$ cd "Program Files"
- 将空格处使用空格引号
$ cd Program" "Files
3.Git clone 错误 | error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
4.Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts.
为IP地址192.30.255.113的主机(RSA连接的)持久添加到hosts文件中。
5.Windows下git出现Permission denied的解决办法
本地git bash 使用git clone git@github.com:***.git方式下载github代码至本地时需要依赖ssh key,遇到权限不足问题时一般都是SSH key失效或者SSH key不存在,重新创建SSH key一般就可以解决问题;
6.Github仓库太大,公司限制速度,下载不了
可以尝试用 码云 去搜下是否有相同的库
7、Git每次push都需要输入用户名和密码
问题:
已经添加了 SSH key,但是 push 的时候,需要输入,用户名和密码
原因:
出现这种情况的原因是我们使用了http的方式clone代码到本地,相应的,也是使用http的方式将代码push到服务器。
git clone https://github.com/xxxxx
这就容易导致这个问题的出现。而如果采用ssh方式的话,是这样clone代码的:
git clone git@github.com:xxxxx
解决办法:
将http方式改为ssh方式即可。
1.先查看当前方式:git remote -v
2.把http方式改为ssh方式。先移除旧的http的origin:git remote rm origin
3.再添加新的ssh方式的origin:git remote add origin git@github.com:xxxx/linux-system-programming.git
4.改动完之后直接执行git push是无法推送代码的,需要设置一下上游要跟踪的分支,与此同时会自动执行一次git push命令,此时已经不用要求输入用户名及密码啦!
git push --set-upstream origin master
8、忽略.gitignore文件与文件状态
忽略文件只能忽略状态为“Untracked files”的文件。
在Git中,文件状态是一个非常重要的概念,不同的状态对应不同的操作。
Git在未进行commit操作之前,存在三种状态:
- Untracked files
- Changes not staged for commit
- Changes to be committed
1、Untracked files就是你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等。那么看着也烦怎么处理呢?
解决:在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
2、对于已经进了暂存区,想丢弃改变,让文件处理忽略状态。可以用
git checkout filename
或者一个文件夹忽略:git checkout xxx/bin/
参考: