1搭建简单git服务器
// 初始化git仓库
git init
// 拷贝仓库 如果初始化没有bare,拷贝的时候带bare参数即可.git init仓库,主分支不能够提交
git clone ./.git --bare
1.1 提交代码三部曲
// 创建或者修改文件;调用git add指定提交的文件;调用git commit提交到本地分支
touch firstFile & git add firstFile & git commit -m "first commit"
// 如果没有配置config,需要配置
git config --global user.email www87538089@qq.com
git config --global user.name ming.xing
// 提交之前,记得执行git fetch或者git pull, git pull= get fetch&get merge
// 如果git pull 有冲突,无法执行可以通过git stash或者git add;git commit先提交
// git stash入栈 git stash list查看栈内容 git stash pop出栈
// git stash apply $1应用指定内容
// 再执行git pull
// (通常不建议执行git pull, 通过git fetch或者git remote update获取最新代码,
// 通过git log origin/分支, 查看远程最新分支代码,再执行git checkout 远程分支
// 该操作不会产生merge点)
// 如果需要忽略untracked文件,需要修改.git/info/exclude文件
// 如果需要忽略tracked文件,需要执行git update-index --assume-unchanged命令
// 还原忽略文件执行git update-index --no-assume-unchanged
// 查看忽略文件执行 git ls-files -v | grep '^h'
1.2 本地和远程做key映射
// 需要在客户端执行ssh-keygen生成pubkey提供给服务器
liangemb@liangemb-OptiPlex-5040:/tmp/git/test/test$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHzt7THNGz3ixRvljltO7J8cKWNvj54rJ/QfL+U/vgzAvtNIhzgjxMQPWSOL1dzsTJuya7X8LL9vvu9M2dER+H/W60806+ATrBrOBfkiiMS66V6VXZzjaPaLZVGRvJeI47nJ70aHKIAC0e8uXpmKzq2x60/z19ZrSFbVdC7jZ78QndrIdj6IG+M1S7jhTXK3Qbs73r7fycWny8vma08c1CABB0gL8iH54iCBdf4FfOjSHtcoTXSGuLhtrBJXTCkn7O3B0wpUVolugQCEH2lgS8dG11f6WUn0nqDanZjzcxTY7OQHOfENoHTCW87twWFq98QV9pIU063omqRKaIdtF/ liangemb@liangemb-OptiPlex-5040
// 服务器端存放路径
git2cast@OptiPlex:~/git/test2$ cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHzt7THNGz3ixRvljltO7J8cKWNvj54rJ/QfL+U/vgzAvtNIhzgjxMQPWSOL1dzsTJuya7X8LL9vvu9M2dER+H/W60806+ATrBrOBfkiiMS66V6VXZzjaPaLZVGRvJeI47nJ70aHKIAC0e8uXpmKzq2x60/z19ZrSFbVdC7jZ78QndrIdj6IG+M1S7jhTXK3Qbs73r7fycWny8vma08c1CABB0gL8iH54iCBdf4FfOjSHtcoTXSGuLhtrBJXTCkn7O3B0wpUVolugQCEH2lgS8dG11f6WUn0nqDanZjzcxTY7OQHOfENoHTCW87twWFq98QV9pIU063omqRKaIdtF/ liangemb@liangemb-OptiPlex-5040
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDk0tWBlCWd9DE0PMDYVsY8115Y84a+6IHN8V0yn4vGOx/sO7b2JMjdOh9ZZQTan8G1pczL4Zo38wGaYVueK8hRDyDrKFJYzbwy/J2ytlZK1XjXMBlRzK4JOaRR0ij8GQ1x46H/r7rFO7QqPHKlTM/jtv/YpD+2xcGdZATdV+3M3b4t2C/Y0wSoVN/QiUezJ1wO02PvnrnNnr+la+i84d3bHdcmu6RqQb68EvNvUzQjVbCQMbu8b90foNCtC+VqEu37RXqnbkJ4qVa+KpnKINZf/xXQsGnk0g2rAK7ytVdWuHqVNZNoZKZUam3AbxuyDs0YeaMpk9AtoqwP84HzEtFF selivert@selivert-OptiPlex-790
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsN4s5qDLlk76I5D2oobDP7zntCjSkhLjYRWi6RvPP+Toide0NB8C7FYMEqyD+OrItpf8rEcgktZ7uj1O/eka74yQdTqDNUYnM0TSb/Ul35RHHGSvYQ3hd60jHJkvAgLAWadVatSktz/V4kvG2grBBaEAbbzQYMuGAtQGGOWR9qbTiJLiNJgOVU+6b8/KSnChr6w0YEYCJLgDwjldbriYfRYTvab7fYpmcluULX6NdIB9mgDVCoQBeDlb21XdM6BNGU3Rh2vy5Y46miGbJ0nRToXE4Cwwj96dL8cRHN6EuKB8nJ/1u7KksH5q5W+PVivUpPuQPwgsKeTwLNIFqjTsv onekey@OptiPlex
2客户端操作
//服务器已经有了客户端的key,git clone不需要再次输入密码
git clone git@192.168.0.159:/home/git/code/test/
//可能会存在没有权限之类的,需要调用ssh-add,其他问题请百度
ssh-add ~/.ssh/id_rsa
//查看日志
git log
// 查看状态
git status
2.1代码分支提交
// 查看远程仓库名称, origin 为远程仓库的别名
onekey@OptiPlex:/media/truecrypt32/svn/Cast/git/test/test$ git remote -v
origin git2cast@192.168.0.159:/home/git2cast/git/test (fetch)
origin git2cast@192.168.0.159:/home/git2cast/git/test (push)
// 本地分支和远程分支名称可以不一样,如果远程没有相同的分支名称,则创建一个分支,如果远程和本地都有该 分支名称,则提交commit的patch
git push origin [分支名称]
// 如果远程和本地分支名称不相等.则提交commit日志(已经执行过代码提交三部曲).
git push origin [本地分支名称] [远程分支名称]
2.2 代码分支同步
// 查看分支
git branch
onekey@OptiPlex:/media/truecrypt32/svn/Cast/git/test/test$ git branch
dev
* master
// 切换分支
git checkout dev
//在当前分支更新代码
git pull
//查看远程分支
git branch -r
//更新远程分支到本地
git pull origin v5(远程分支名)
//创建本地分支并映射到远程分支
git checkout -b localv5 origin/v5
//名称可以相同
git checkout -b v5 origin/v5
2.3 提交代码合并到其他分支
// 分支A和分支B,分支A提交代码3dbd40016550490c99bdd6df426fd060115166d5
onekey@OptiPlex:/media/truecrypt32/svn/Cast/git/test/test$ git log
commit 3dbd40016550490c99bdd6df426fd060115166d5
Author: wWX152939 <www87538089@qq.com>
Date: Wed Jan 30 11:01:02 2019 +0800
multi commit
commit 3033871296c71b406957f50a85408b95f9226a9b
Author: wWX152939 <www87538089@qq.com>
Date: Wed Jan 30 10:50:36 2019 +0800
v5 second push
commit c13af06b4611c8460013073dd4f7e00b95943859
Author: wWX152939 <www87538089@qq.com>
Date: Wed Jan 30 10:33:06 2019 +0800
v5 commit
commit 0ab75a6c33be68e887b4564e939863a171826be3
Author: zhiwei.wang <www87538089@qq.com>
Date: Wed Jan 30 10:25:54 2019 +0800
first commit
//要将3dbd40016550490c99bdd6df426fd060115166d5合并到分支B,切换到分支B,执行
git cherry-pick 3dbd40016550490c99bdd6df426fd060115166d5
3. 项目管理中的git应用
3.1分仓
通常复杂的项目(含有多个主线 版本)需要多个分支,但是项目中有很多代码是公用的,此时公用的部分需要单独建平台仓,而差异的部分建立差异仓,便于更好的维护代码。
3.2多个主线&多个开发分支
首先主线是用于发布版本的,开发代码不能在主线上修改。只有比较紧急的bug才可以临时修改在主线上。在一段代码开发完成后,需要将多个commit提交合并到多个主线上。通常使用rebase或者merge操作。
git checkout origin/dev // 切换到dev开发分支上
git rebase -i origin/master //将dev上的修改合并到master分支,并且进入编译模式。
git checkout origin/master // 切换到master分支上
git merge --no-ff origin/dev //将dev上的修改按照一笔合并到master分支。