git常用命令
网址
官网: https://git-scm.com/docs/gitmodules
中文版: https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97
相关博客: http://www.cnblogs.com/pyer/p/4752770.html
commit建议: conventionalcommits
特性
搭建git服务器
1. 安装git:
unbuntu: sudo apt-get install git
2. 创建一个git用户,用来运行git服务:
sudo adduser git
3. 创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个
4. 初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
sudo chown -R git:git sample.git
5. 禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
6. 克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。
配置
1. git设置关闭自动换行
git config --global core.autocrlf false
为了保证文件的换行符是以安全的方法,避免windows与unix的换行符混用的情况,最好也加上这么一句
git config --global core.safecrlf true
2. 怎样遍历移除项目中的所有 .pyc 文件
sudo find /tmp -name "*.pyc" | xargs rm -rf替换/tmp目录为工作目录
git rm *.pyc这个用着也可以
避免再次误提交,在项目新建.gitignore文件,输入*.pyc过滤文件
3. 创建和使用git ssh key
首先设置git的user name和email:
git config --global user.name "xxx"
git config --global user.email "xxx@gmail.com"
查看git配置:
git config --list
然后生成SHH密匙:
查看是否已经有了ssh密钥:cd ~/.ssh
如果没有密钥则不会有此文件夹,有则备份删除
生存密钥:
ssh-keygen -t rsa -C "xxx@gmail.com"
按3个回车,密码为空这里一般不使用密钥。
最后得到了两个文件:id_rsa和id_rsa.pub
注意:密匙生成就不要改了,如果已经生成到~/.ssh文件夹下去找。
4. git变更项目地址
git remote set-url origin git@192.168.6.70:res_dev_group/test.git
git remote -v
常用命令
1. 新建本地仓库,克隆远程仓库,提交修改
git init
git remote clone origin git@ce.rongshutong.com:10022/data/account_manager.git
git add .
git commit -m "计费中心项目,当前完成基本注册和充值模块"
git push
2. 分支的意义与管理
创建分支可以避免提交代码后对主分支的影响,同时也使你有了相对独立的开发环境。分支具有很重要的意义。
提交代码后才能在其它机器拉分支代码
创建并切换分支:
git checkout -b new_branch
查看当前分支:
git branch
切换到master分支:
git checkout master
合并分支到当前分支:
git merge new_branch # 合并分支的操作是从new_branch合并到master分支,当前环境在master分支。
删除分支:
git branch -d new_branch
代码合并:
步骤 1. 获取并检出此合并请求的分支
git fetch origin
git checkout -b v1.4_rewards origin/v1.4_rewards
步骤 2. 在本地查看更改
步骤 3. 合并分支并修复冲突
git checkout master
git merge --no-ff v1.4_rewards
步骤 4. 将合并结果推送到Git服务器
git push origin HEAD:master
3. git submodule的使用拉子项目代码
开发过程中,经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用,而公共代码库的版本管理是个麻烦的事情。今天无意中发现了git的git submodule命令,之前的问题迎刃而解了。
1) 添加
为当前工程添加submodule,命令如下:
git submodule add 仓库地址 路径
其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone)
命令执行完成,会在当前工程根路径下生成一个名为“.gitmodules”的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。
2) 删除
submodule的删除稍微麻烦点:
首先,要在“.gitmodules”文件中删除相应配置信息。
然后,执行git rm –cached命令将子模块所在的文件从git中删除。
需要的话在.git文件夹中的相关子模块文件: rm -rf .git/modules/assets
3) 下载的工程带有submodule
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:
git submodule update --init --recursive
即可将子模块内容下载下来后工程才不会缺少相应的文件
4. git顺利的提交代码流程
查看修改的文件:
git status;
为了谨慎检查一下代码:
git diff;
添加修改的文件:
git add dirname1/filename1.py dirname2/filenam2.py # 新加的文件也是直接add就好了
添加修改的日志:
git commit -m "fixed:修改了上传文件的逻辑";
提交代码:
git push
如果提交失败的可能原因是本地代码库版本不是最新。
5. git tag使用
git tag # 列出当前仓库的所有标签
git tag -l 'v0.1.*' # 搜索符合当前模式的标签
git tag v0.2.1-light # 创建轻量标签
git tag -a v0.2.1 -m '0.2.1版本' # 创建附注标签
git checkout [tagname] # 切换到标签
git show v0.2.1 # 查看标签版本信息
git tag -d v0.2.1 # 删除标签
git tag -a v0.2.1 9fbc3d0 # 补打标签
git push origin v0.1.2 # 将v0.1.2标签提交到git服务器
git push --tags # 将本地所有标签一次性提交到git服务器
git tag # 查看当前分支下的标签
6. 回滚到某个分支:
git log
找到需要回退的那次commit的哈希值,
git reset --hard commit_id
7. git add文件取消
git reset HEAD <file>...,
8. 查看修改历史
git log # 查看日志
git show 4ebd4bbc3ed321d01484a4ed206f18ce2ebde5ca # 查看某一历史版本的提交内容
git diff c0f28a2ec490236caa13dec0e8ea826583b49b7a 2e476412c34a63b213b735e5a6d90cd05b014c33 # 对比不同版本
git log --pretty=oneline 文件名 # 显示修改历史
9. git删除文件:
删除文件跟踪并且删除文件系统中的文件file1:
git rm file1
提交刚才的删除动作,之后git不再管理该文件:
git commit
删除文件跟踪但不删除文件系统中的文件file1:
git rm --cached file1
提交刚才的删除动作,之后git不再管理该文件。但是文件系统中还是有file1:
git commit
# 删除 untracked files
git clean -f
# 连 untracked 的目录也一起删掉
git clean -fd
# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
# 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd
10. git rebase 操作
71 git rebase -i master
72 git status
73 git push origin v2.3_joeeyuan
74 git push origin v2.3_joeeyuan -f
75 git pull
76 git fetch
77 git ls-remote
11. 已经被跟踪文件如何忽略
git update-index --assume-unchanged <file>
12. 批量删除分支
- 本地:
git tag | grep -v "v0.1.31" |xargs git tag -d
- 远端:
git show-ref --tag | grep -v "v0.1.31" | awk '{print $2}' | xargs git push origin --delete
13. 重置密码
git config --system --unset credential.helper
14. git commit 融合提交
git merge --squash another
git commit -m "message here"
其效果相当于将another分支上的多个commit合并成一个,放在当前分支上,原来的commit历史则没有拿过来
网络和代理
https -> ssh:
For Github:
git config --global --add url."git@github.com:".insteadOf "https://github.com/"
For Gitlab:
git config --global --add url."git@gitlab.com:".insteadOf "https://gitlab.com/"
常见问题
1. GIT解决个人分支与Master分支冲突:
git checkout master
git pull
git checkout yzy
git merge master # 这句话的意思是把master的东西融合到当前分支即yzy中
之后修改冲突文件
之后重新提交:status -> diff -> add -> commit -m -> push
冲突文件冲突的地方示例:
a123
b789
b45678910
冲突标记
<<<<<<< (7个<)与=======之间的内容是我的修改
=======与>>>>>>>之间的内容是别人的修改
此时,还没有任何其它垃圾文件产生
2. git push 时报错 warning: push.default is unset;
'matching'参数是 Git 1.x 的默认行为,其意是如果你执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支。而 Git 2.x 默认的是 simple,意味着执行 git push 没有指定分支时,只有当前分支会被 push 到你使用 git pull 获取的代码。
根据提示,修改git push的行为:
git config --global push.default matching
再次执行git push 得到解决。
3. 一些其他错误处理
“pathspec ‘branch’ did not match any file(s) known to git.”错误
git checkout master
git pull
git checkout new_branch
使用git提交比较大的文件的时候可能会出现这个错误
error: RPC failed; result=22, HTTP code = 411
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
Everything up-to-date
这样的话首先改一下git的传输字节限制
git config http.postBuffer 524288000
然后这时候在传输或许会出现另一个错误
error: RPC failed; result=22, HTTP code = 413
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
Everything up-to-date
这两个错误看上去相似,一个是411,一个是413
下面这个错误添加一下密钥就可以了
首先key-keygen 生成密钥
然后把生成的密钥复制到git中自己的账号下的相应位置
git push ssh://192.168.64.250/eccp.git branch
多个远程分支,本地没有分支 fatal: ‘testing/incy’ matched multiple (2) remote tracking branches
git checkout --track origin/testing/incy