本文目录
- 1.克隆分支到本地
- 2.Git 分支相关问题
- 3.解决冲突
- 4.版本回退=>撤销上一次的提交
- 5.git 提交到本地仓库有问题怎么办
- 6.Git 代码已经 push 上去发现有问题
- 7.Git 关于暂存的问题
- 8.当前项目更换远程仓库关联
参考文档:三年 Git 使用心得 & 常见问题整理
http://mp.weixin.qq.com/s?__biz=MzIxNjgwMDIzMA==&mid=2247486260&idx=1&sn=87a0ba738588a4b25d832fb31ad29b16&chksm=9782c5bda0f54cabc267a47f7c2e6334e6d4f386f66f22a469e8a47b755b8ed40ce4ff9885f6&mpshare=1&scene=24&srcid=&sharer_sharetime=1592369500996&sharer_shareid=7ecb79d72854b17d5ce259e809244970#rd
使用 Git,10个最需要常备的后悔药
http://mp.weixin.qq.com/s?__biz=MzIzNTU2ODM4Mw==&mid=2247492270&idx=2&sn=235b5736c296d5f1ee3b639abcafd6ea&chksm=e8e78f3edf9006289414a4d2cf0a50e80913eeb6d0b81f40dbbf5f6fd07378585186b1c631f3&mpshare=1&scene=24&srcid=&sharer_sharetime=1593652706694&sharer_shareid=7ecb79d72854b17d5ce259e809244970#rd
1.克隆分支到本地
git clone只能clone远程库的master分支,无法clone所有分支,解决办法如下:
1. 找一个干净目录,假设是git_work
2. cd git_work
3. git clone http://myrepo.xxx.com/project/.git ,这样在git_work目录下得到一个project子目录
4. cd project
5. git branch -a,列出所有分支名称如下:
remotes/origin/dev
remotes/origin/release
6. git checkout -b dev origin/dev,作用是checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支
7. git checkout -b release origin/release,作用参见上一步解释
8. git checkout dev,切换回dev分支,并开始开发。
2.Git 分支相关问题
分支中的常用命令:
- git 拉取指定分支的代码:git clone -b 分支名称 地址
- 查看当前分支:git branch
- 查看远程分支:git branch -a
- 创建并切换分支:git checkout -b add_orderdesc
- 切换分支:git checkout 分支名称
- 查看当前的本地分支与远程分支的关联关系:git branch -vv
3.解决冲突
git冲突在这两天有些频繁,在git pull合并代码的时候,就发生冲突,而且反复执行发现还是存在冲突,后来发现了一个状态–Merging。
解决方法
git pull 出现冲突后可以暂存本地修改git stash ,然后git pull 更新代码,git stash list 可查看暂存记录列表,释放本地暂存 git stash apply stash@{0} ,出现冲突文件,找到并解决,然后可以提交git add . 加入索引库,然后本地提交git commit -m '注释' 最后git push到远程
4.版本回退=>撤销上一次的提交
git reset --hard head
该命令是回退版本信息,在Git中,用HEAD表示当前版本,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
如:git reset --hard HEAD~3
5.git 提交到本地仓库有问题怎么办
情景:最近一次 commit 的代码有问题怎么办?
这时候可能有小伙伴说直接修改再提交一次不就好了,这里说一下优雅的方式,不进行再一次提交,修改这次提交。
git add 我是修改内容.txt
git commit --amend
【amend】修正,会对最新一条 commit 进行修正,会把当前 commit 里的内容和暂存区(stageing area)里的内容合并起来后创建一个新的 commit,用这个新的 commit 把当前 commit 替换掉。
输入上面的命令后,Git 会进入提交信息编辑界面,然后你可以删除之前的 changeId,并且修改或者保留之前的提交信息,:wq 保存按下回车后,你的 commit 就被更新了。
对于 amend 还可能出现几种小问题,下面列举下:
刚刚写的提交信息有问题,想修改怎么办?
git commit --amend -m "新的提交信息"
刚刚提交完代码发现,我有个文件没保存,漏了提交上去怎么办?
最简单的方式,再次 commit:
git commit -m "提交信息"
另一中方式,使用--no-edit,它表示提交信息不会更改,在 git 上仅为一次提交。
git add changgeFile // changeFile 刚刚漏了提交的文件
git commit --amend --no-edit
6.Git 代码已经 push 上去发现有问题
情景:出错内容已经 push 到了 master 分支
这种情况可以使用 Git 的 revert 指令。
git revert HEAD^
上面这行代码就会增加一条新的 commit,它的内容和倒数第二个 commit 是相反的,从而和倒数第二个 commit 相互抵消,达到撤销的效果。
在 revert 完成之后,把新的 commit 再 push 上去,这个 commit 的内容就被撤销了。
revert 与前面说的 reset 最主要的区别是,这次改动只是被「反转」了,并没有在历史中消失掉,你的历史中会存在两条 commit :一个原始 commit ,一个对它的反转 commit。
7.Git 关于暂存的问题
假如正在开发手中需求的时候,突然来了个紧急 bug 要修复,这时候需要先 stash 已经写的部分代码,使自己返回到上一个 commit 改完 bug 之后从缓存栈中推出之前的代码,继续工作。
- 添加缓存栈: git stash
- 查看缓存栈: git stash list
- 推出缓存栈: git stash pop
- 取出特定缓存内容:git stash apply stash@{1}
注意:没有被 track 的文件(即从来没有被 add 过的文件不会被 stash 起来,因为 Git 会忽略它们。如果想把这些文件也一起 stash,可以加上 -u 参数,它是 --include-untracked 的简写。就像这样:git stash -u
敏捷流程:版本控制
版本控制可不止是 pull/push
语义化版本
如版本号:1.2.3-beta.1+meta
1代表主版本,2代表次版本,3代表修订号
beta代表先行版本
主版本一定不要随便去进行升级
版本名称释义:
alpha => beta => rc => release
alpha:测试版本
beta:公测版本
rc:release candidate,发行候选版本,主要是排错,修改bug
release:发行版本
版本控制工具Git
clone代码仓库以前一般都是用https,git clone https://xxxxxxx
https的一大特点就是必须要输入用户名和密码
本地电脑上生成ssh,git bash中进行操作
ssh-keygen -t rsa -b 4096 -C "你的github邮箱"
Enter file in which to save the key?(我们可以指定密钥文件的生成路径和文件名,直接回车则使用默认设置)
Enter passphrase?(键入passphrase,适用场景:多个人共用一对密钥,可以给密钥设置上passphrase,这样每次clone代码的时候还需要额外输入passphrase,这样可以保证密钥不公开,相当于密钥的密码,如果只是个人使用,则不需要设置passphrase,直接回车就行)
id_rsa_pub 这就是公钥文件
cat -/ssh/id_rsa.pub 在命令中打开这个文件,然后复制,将公钥放到github的settings中的SSH and GPG keys
当我们不想使用默认的密钥,或者是需要使用别的密钥去和别的github仓库进行通讯的时候,该怎么办
密钥的默认存放位置是在用户文件夹下的.ssh文件夹,在这里新增一个config文件,不添加任何后缀名,打开这个文件,里面会有默认的内容, 在文件内容的最下面添加以下代码
Host github.com
HostName github.com
User github的user
PreferredAuthentications publickey
IdentityFile /Users/xxxx/xx
Host 可以看作是HostName 的别名,如果本地电脑只有一个密钥对,我们可以让Host=HostName
PreferredAuthentications 表示一种鉴权方式,固定这样写就行
IdentityFile 指定密钥的路径,绝对路径
保存文件之后就可以直接使用git clone命令
git clone [email protected]:xxxxxx.git
Host配置的别名 可以让我们使用IdentityFile指定的密钥进行clone操作(保存了刚才的config之后需要新建一个终端进行接下来的操作)
git clone Host里设置的别名:xxxxxx.git
意思也就是将github.com改成Host里配置的别名
此时 git remote -v 可以看到此时项目的指向是我们通过Host配置的独特的名称,这样就实现了clone一个仓库,但是指定使用对应的不同的密钥。
issus:“提问”
[email protected]
pull request 别人发起pr,我作为仓库主人进行code review,觉得ok的话就accept
我们在github账户上新建了一个仓库后,github提供了两种向这个仓库推送代码的方式,第一种方式是和本地电脑的空文件夹建立联系(create a new repository on the command line),第二种是本地代码已经有了远程仓库,但是还要把本地代码给推送到我们新建的这个仓库中(push an existing repository from the command line)
git remote add origin [email protected]:chenhui-syz/test.git
git branch -M main
git push -u origin main
origin 代表我们给起的仓库的别名
git核心概念-快照
git工作区:
- git clone
- git init
- git add
-
git fetch
git fetch+git merge相当于git pull
git fetch origin dev 去拉取远程origin的dev分支上的代码更新,但还不会真正的把代码拉到本地
上图表示拉取到的代码放到了FETCH_HEAD变量中了
如果我们看到更新的代码是我们想要的,可以使用
git merge FETCH_HEAD
直接将代码覆盖本地修改 - git pull/push
git push origin feature:feature 把本地的feature分支代码推送到远端origin仓库的feature分支 - git checkout
- git log/reflog
git log命令可以看到之前的提交记录(包括提交时间和提交人)
git reflog查看本地的提交记录,包括删除等记录 - git config/status
git config --global --list 查看全局配置(user.name和user.email)
git config --global user.name "your_name" 设置提交人的名字
git config --global user.email "your_email" 设置提交人的邮箱
git版本库之stage:
- git reset
- git checkout
git checkout demo_branch 切换到demo_branch分支上
git checkout -b demo_branch 创建demo_branch分支并切换到demo_branch分支上 - git stash&apply
git stash 缓存当前本地文件的修改
git stash apply 找回缓存的本地文件的修改 - git rm
- git status
查看本地文件和版本仓库文件中的差异
git版本库之master:
- git branch
git branch demo_branch 创建一个名字叫demo_branch的分支 - git merge
git merge dev1 将dev1分支上的内容合并到当前所在的分支上 - git diff
查看本地版本和版本库的版本的文件变化对比,有点像git status,但是可以看到代码变化的对比 -
git remote
git remote -v 当前本地项目对应的远程仓库地址
像下面这种情况代表当前项目对应着两个远程仓库,别名分别是origin和origin1
git pull origin master 拉取origin仓库的master分支最新代码到本地项
- git rebase
- git reset
git fetch origin feature:dev 将远端origin仓库的feature分支代码合并到本地的dev分支上,如果本地没有dev分支,则git会默认在本地创建一个dev分支
git reset --hard head^ 回退到上一次提交
如果上面指令回退了之后又后悔了该怎么办呢 ,可以git reflog查看本地的所有操作记录,最前面的就是当次操作的hash值,然后 git reset --hard hash值 就可以将本地代码版本跳转到指定的版本上。
HEAD@{1} 也代表当次操作记录的标记值,如 git reset --hard head-1 也可以回到指定的操版本上
git tag v1.0.0 给当前的分支的版本打上 v1.0.0的标记
git tag --list 查看当前版本的tag
git push origin master --tags 像远端origin仓库的master推送代码,并且将自身版本的tag也推送上去
git tag -d v1.0.0 删除当前版本上面的v1.0.0tag
git branch -D feature 删除远程和本地的feature分支
git reset HEAD 是将咱暂存区和HEAD的提交保持一致
git reset --hard HEAD 是将工作区、暂存取和HEAD保持一致
git checkout -- demo.text 将工作区的demo.text的修改丢弃掉
可以通过git remote set-url --add origin https://url来为一个本地项目添加多个别名一样的远程仓库,同时把所有的github账号设置成同一个SSH密钥,全部添加到origin
中,但是这种方式会有很大的流程上的问题,不建议一次推送多个仓库,要考虑到一般版本控制会对接自动化流程,所以建议是设置多个仓库地址的别名进行分别推送。
对于已有代码的项目,可以使用git init初始化一个仓库,再使用git remote add添
加仓库地址,最后就是git push
docker run搭建gitlab平台
搭建gitlab最少要2核2G的服务器
一句命令在服务器上部署gitlab的docker镜像
运行指令之后查看运行状态
docker ps | grep gitlab_test
用firewall的方式去放行13800端口
firewall-cmd --add-port=13800/tcp --permanent
后来有方便的方式去放行端口,这样的话通过访问ip+端口就可以访问我们自己服务器上的gitlab了
接下来介绍另外一种更全面的方式:使用docker-compose进行部署,集成了邮件服务等其他应用
大神写好的 github.com/sameersbn/docker-gitlab
查找项目里的docker-compose.yml复制一份到本地,命名docker-compose-gitlab.yml,然后进行修改
GITLAB_HOST改成服务器的IP或者域名
GITLAB_PORT改成实际的端口,如13800
GITLAB_SSH_PORT改成实际的端口,如13822
GITLAB_ROOT_PASSWORD 密码必须是8位的
GITLAB_ROOT_EMAIL 配置邮箱
ports端口映射改成实际的
刚改好的文件代码复制,命令行中 先 docker stop gitlab_test 停止掉之前的镜像,然后docker rm gitlab_test删除掉,否则会和现在要添加的docker冲突
cd到我们想要放置镜像的文件夹下,如tmp,这个文件夹的选择是随意的 ,记得要和配置文件docker路径前面的文件夹名字相同,然后vi docker-compose.yml新建一个文件,使用i变成insert的状态,然后粘贴进来刚才的代码,检查无语后退出并保存编辑,然后 docker-compose up -d运行
检查一下运行状态 docker ps | grep tmp grep tmp 是进行筛选我们要查看的docker列表
此时可以通过ip+端口去访问了
一句指令就可以进行备份
刚才安装的compose已经自动设置了定时器任务去自动备份
docker-compose.yml配置文件有相关的属性进行了配置
GITLAB_BACKUP_SCHEDULE=daily 按天进行备份
GITLAB_BACKUP_TIME=01:00 每晚1点进行备份
vi到配置文件中,使用o意思是往下一行添加代码
GITLAB_BACKUP_EXPIRY=604800 设置为超过7天就删除
修改完配置文件后 docker-compose up -d 更新配置文件
上面是自动备份,手动配置也就是一句指令就可以了
docker-compose run --rm gitlab app:rake gitlab:backup:create
如果打算恢复指定的版本,官网文档有相关的文档介绍,也都是一行指令就可以搞定
使用docker-compose去进行运维操作,非常的简单便利
注意点:
docker-compose命令需要在配置文件目录下执行
恢复文件需要使用恢复文件的全名(包括.tar结尾)
git权限控制
如果团队的人比较多且水平参差不齐,不应该所有分支都放开权限,要进行分支保护
gitlab里不要去删除成员,因为删除掉之后,这个成员的历史提交记录都也会不存在了
gitignore.io 搜索相关内容 如node mac,可以自动产生相关的gitignore内容
还有另外一种方法:vscode安装插件:.gitignore generator
使用:在项目目录里使用快捷命令(ctrl+shift+p) Generate .gitignore File
勾选相关的选项,点击确定,项目里就会自动产生gitignore文件
sourcetree git的可视化操作工具
vscode插件 gitlens
如果我们误将某些不需要git上传的文件 git add . 了,可以使用git reset 重置,如果将这些文件添加到gitignore中,add的时候还是将其加入到了缓存区,可能是因为之前这些文件已经被git跟踪了,可以使用git rm --cached -r .
清空全部的git缓存信息。
8.当前项目更换远程仓库关联
首先git remote -v 查看下当前本地项目关联的远程仓库的本地名字,一般默认是origin
然后git remote remove origin 删除关联,
git remote add origin newUrl 关联新的远程仓库
git push --set-upstream origin main 将项目和远程仓库的main分支进行关联