git版本控制
原创
©著作权归作者所有:来自51CTO博客作者一片白纸的原创作品,请联系作者获取转载授权,否则将追究法律责任
git基本操作
git初始化:
git init #初始化
git status #查看文件状态
git ls-tree head #查看版本中所有文件
git ls-files -s #查看暂存区和版本中所有文件
git add fileName.py #提交单个文件
git add . #添加所有文件到暂存盘
git commit -m "all file" #从暂存盘提交到本地版本库,并加上注释
git log #查看日志(备注:git log退出方法 英文状态下按Q)
git reflog #查看所有日志(包含之前回退后消失的版本记录)
git stash #将当前修改的内容保存到一个地方
版本/文件回退:
# 方式一:(3步)
git reset --soft 版本号 #从分支回到暂存区
git reset head 文件 #从暂存区回退到修改过的内容/文件创建前的状态
git checkout 文件名 #从修改过的文件到原文件
# 方式二:(2步)
git reset --mix 版本号 #从分支回到修改过的内容 == git reset 版本号
git check out 文件 #从修改过的文件到原文件
#方式三: (一部步操作)
git reset --hard 版本号 #直接从版本库中的分支回到原文件最初状态
案例1:
开发完短信功能后进行提交,之后再回退到开发短信功能之前的状态,最后再次回到短信功能开发的状态
#开发短信功能
# 先创建msg.txt文件
git add .
git commit -m '开发短信功能完成'
#回滚(无短信功能):
git log
git reset --hard 版本号
#再次回到短信功能:
git reflog
# 下面两步的操作等于 git reset --hard 版本号
git reset --mix 版本号
案例二:stash 将工作区做的所有修改(做到一半的操作)保存到一个临时地方
应用场景:在同一版本下,新写的部分代码不想为了修改第1次版本的代码,而要再将新写的代码提交成第2个版本。
#- 正在写代码(a.txt),发现线上代码(a.txt)有bug,先把现在的代码保存到临时空间。
#- 修改完bug(a.txt)后提交,再次取回之前保存的文件,这时发现之前保存的代码和提交的bug是同一个文件,有冲突。
#- 这时(a.txt)中两者都保留,手动保留想要的代码,再次提交。
# 先将代码提交
# 在提交后的代码基础上写新的代码
git stash # 需要临时修复bug,将当前代码临时转移到到一个位置
#修改bug后再次提交
bug....
git add .
git status
git commit -m "修改完bug"
# 将临时代码释放回来,需要手动解决代码冲突(merge合并代码,或者版本回退,回退到写代码前的版本)
git stash apply # 重新回到写新代码的状态
git add .
git status
git commit -m "修改完bug后,重新提交的新代码"
分支
dev # 负责开发新功能
bug # 负责修复线上的bug
master # 线上主分支的代码
dev开发分支
# 查看所有分支
dev
* master # 当前分支
git branch dev # 添加dev开发分支
git branch # 查看分支
git checkout dev # 切换到dev分支
bug分支
git branch bug
git branch
bug
dev
* master
git branch bug
git checkout bug
git branch
* bug
dev
master
修改完bug 把bug分支和master合并
git checkout master
git merge bug # 在master分支基础上将bug分支上的代码进行合并
远程仓库
从远程仓库拉取代码到本地仓库:
git remote add origin https://github.com/test.git #设置从远程仓库拉取代码的地址,并设置别名为origin
git clone https://github.com/linhai1111/git_test.git # 将远程仓库中的项目拉取到本地仓库
cd git_test # 进入项目文件中
git branch -a #查看所有分支 ,包含远程的分支
#* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/dev
git branch dev origin/dev #拉取远程仓库中dev分支的代码到本地,并创建出本地仓库的dev分支
# 将本地代码推送到远程仓库
git remote add origin https://github.com/test.git #设置远程仓库并设置别名origin
git checkout master # 切换到master分支
git push origin master #推送到master分支
远程仓库应用场景流程
在公司时:
# 将远程仓库中的项目拉取到本地后再提交到远程仓库中
git remote add origin https://github.com/a877252372/test.git
git checkout master
git push origin master # 推送到远程仓库
回到家中:
git clone https://github.com/a877252372/wwwww.git
cd /test
git branch dev origin/dev # 创建本地仓库中的dev分支,并将远程仓库中的dev分支的代码拉取到创建好的本地dev分支
git checkout dev # 切换到dev分支
写代码
git add .
git commit ...
git push origin dev # 将本地dev分支代码提交到远程仓库中的dev分支中
再次回到公司:
git checkout dev # 切换到dev分支
#将远程仓库中的dev分支代码拉取到本地,(选其中一个方式,推荐pull方式)
git fetch origin dev # 从远程拉到本地的仓库 还需要 git reset --hard 文件
git pull origin dev # 从远程仓库中将dev分支的代码拉取到本地dev分支
#----------提交成功完成-----------
完成功能3开发
git add .
git commit ...
git push origin dev
#----------忘记提交,下班回家-------
完成功能4开发:
git add .
git commit ...
再次回到家中:
git branch dev
git pull origin dev
完成功能5开发:
git add .
git commit ...
第三次到达公司:
# 现在处于功能4处于没有提交的状态
#先拉代码查看功能4和功能5是否有冲突,如果有冲突需手动修改,不能直接提交.
# 拉取代码:
git pull origin dev
无冲突:过
有冲突:手动解决
git add .
git commit -m '解决冲突'
协同开发应用场景流程
协同开发准备:
前期准备:在远程仓库中设置组织,并通过账户名邀请用户成为项目成员
- 项目协作者
- 组织
具体流程:
小明和小强同时在开发。
# 小明或小强在自己分支开发完成后推到远程仓库中。
git clone ....
git branch dev # 小明和小强都要创建dev分支
git branch review # 小明和小强都需要创建的分支,专门用来合并各个成员的代码
git branch xiaoming # 只在小明在自己的本地仓库创建xiaoming分支
git branch xiaoqian # 只在小强在自己的本地仓库创建xiaoqian分支
git pull origin dev # 将远程仓库中的dev分支代码拉取到本地dev分支(小明和小强都要进行拉取)
git pull origin review # 小明和小强都需拉取该分支的代码
git pull origin xiaoming # 只需小明进行拉取,属于他专属的分支
git pull origin xiaoqian # 只需小强进行拉取,属于他专属的分支
git checkout xiaoming # 切换到xiaoming专属于的开发分支上进行开发
git checkout xiaoqian # 切换到xiaoqian专属于的开发分支上进行开发
.......
git add .
git commit -m ""
git push origin xiaoming # 小明将代码推送到远程仓库中的xiaoming分支上
git push origin xiaoqian # 小强将代码推送到远程仓库中的xiaoqian分支上
# 小明进行代码合并,将自己的代码合并到review
git checkout review # 切换到review分支
git pull origin review # 将远程仓库中的review分支拉取最新的代码,到本地仓库中的review分支上
git merge xiaoming # 将xiaoming分支合并到review分支上
git status
git push origin review # 再次将本地review分支推送到远程仓库中的review分支上,完成远程仓库中代码的更新
# 小强也进行代码合并,也将自己的代码合并到review
git checkout review
git pull origin review
git merge xiaoqiang # 将xiaoqian分支合并到review分支上
备注:2人同时提交时,后提交的人必须再次进行pull代码的操作来完成更新后,再提交时才不会报错。
项目fork
针对他人的项目进行fork后,可在本地自主进行项目修改,修改后可通过 New pull request 选项提交给项目原始人,由项目原始人负责是否引用该代码。
ssh免密登陆
该方式只针对ssh模式。
ssh-keygen -t rsa -C "xxxxx@xxxxx.com" -## 标题 ##f "d:\id_rsa" # ssh-keygen生成sshkey
#xxxxx@xxxxx.com是个人邮箱
#d:\id_rsa 是生成的sshkey文件
或者直接生成到C盘:
cd ~/.ssh && ssh-keygen
cat id_rsa.pub | clip # 复制key
# 设置身份
git config --global user.name "bob"
git config --global user.email bob@...
最后生成两个文件id_rsa和id_rsa.pub,把这两个文件放到.ssh文件夹下,windows中.ssh文件夹一般在系统盘的用户下(c:\users)
用记事本把id_rsa.pub打开,把文本添加到oschina的公钥列表中
测试:
在git bash中输入ssh -T git@git.oschina.net 返回Welcome to Git@OSC, 你的名字! 表示添加成功。
注意事项:生成的sshkey文件一定要命名为id_rsa,因为ssh默认读id_rsa的sshkey。**
在完成以上配置后,提交代码还是需要输入用户名和密码,可以到本地git repository的.git\config文件,如果url使用的是https协议,改为git协议即可。
修改前:
[remote "origin"]
url =
fetch = +refs/heads/*:refs/remotes/origin/*
修改后
[remote "origin"]
url = git@git.oschina.net:oschina/git-osc.git
fetch = +refs/heads/*:refs/remotes/origin/*