git基本操作
1、Git基本设置
-
git config --global user.name “ken” // 设置用户名
-
git config --global user.email “ken@gmail.com” // 设置邮箱
-
git config --global --list // 显示用户名邮箱
-
git add helloworld.c // 添加单个文件
-
git add . // 添加所有
-
git commit -a // 提交
-
git commit -am “first commit” // 提交并填写commit的内容
-
i // 输入commit的内容
-
git fetch:相当于是从远程获取最新版本到本地,不会自动merge
git fetch <远程主机名> <分支名> ------> git fetch origin master -
git push origin master // 同步至服务器,相当于git fetch 和 git merge
-
git push origin master --no-verify // 跳过iLint扫描,强推
-
git pull origin master // 同步服务器代码到本地
-
git clone git@bigkoogit:testing // url:project 获取代码
-
git diff file // 查看不同内容
-
git log // 查看提交日志
-
git status // 查看状态
-
先按 Esc ,再 shirt + : // 允许输入wq,准备退出
-
wq // 保存退出
-
git reflog // 找回消失的commit。可以查看所有分支的所有操作记录(包括commit、reset的操作和删除的commit记录,git log则不能察看已经删除了的commit记录)
(1) 打印如下:
$ git reflog
d185b35 HEAD@{0}: rebase finished: returning to refs/heads/passport
d185b35 HEAD@{1}: rebase: checkout origin/passport
4ab8e52 HEAD@{2}: checkout: moving from passport_email to passport
d185b35 HEAD@{3}: checkout: moving from passport to passport_email
4ab8e52 HEAD@{4}: checkout: moving from passprot_bak to passport
d185b35 HEAD@{5}: checkout: moving from passport to passprot_bak
4ab8e52 HEAD@{6}: checkout: moving from passprot_bak to passport
d185b35 HEAD@{7}: commit: 添加邮件发送处理操作
(2)将删除的记录恢复,然后可以使用这个‘消失的’commit重新建立一个branch
git reset --hard d185b35
- git log // 格式化输出
git config --global alias.gl "log --graph --pretty=format:'%Cred%h%Creset %Cgreen(%ad)%Creset :%C(yellow)%d%Creset %s [%cn,%an]' --abbrev-commit --date=short"
git gl
-
版本回滚到某一版本(或取消merge)
git reset --hard 版本号 // 不填版本号即放弃所有修改到当前版本
git reset --hard fb95cc86 -
版本回滚到某一版本,并且保留所有修改的文件
git reset fb95cc86 -
版本回滚到上一版本
git reset --hard HEAD~1 -
要把dev-3.0分支上的某些更改移到2.x的版本
git cherry-pick fb95cc86 -
从一个分支cherry-pick多个commit到其他分支
// 两个点表示把两个 commit 区间的所有 commit 都复制过去
git cherry-pick 1aa6cf2d…c8f5e18f
// 注意,不包含第一个 commitid 的写法
git cherry-pick (commitid1…commitid100] -
版本回滚后,删除远程仓库的某次错误提交
git push -f origin master -
提交到远程仓库
git push [仓库名 本地分支:远程分支]
git push origin ver3-dev:ver3-dev -
打tag
git tag -a 3.0 -m “my version 3.0” [commit 号]
把tag提交到远程服务器
git push --tags -
开始创建标签,创建标签的两种方式:
git tag -a 4.1.0 -m “20170328” //创建标签, -a 加标签,-m 加标签注释。
git tag 4.1.0 //创建轻量级标签,不用-a,-m等参数 -
查看创建的标签
git tag //列出git中现有的所有标签
git show lilerong //git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象 -
加上-f 覆盖原有的tag:git tag -f 4.1.0a
-
推送指定的标签:git push origin 4.1.0
-
要一次推送所有本地新增的标签上去,可以使用 --tags 选项:git push origin --tags,
-
删除标签: git tag -d 4.1.0
删除服务器标签:git push origin :refs/tags/4.1.0 -
创建分支
git branch local
切换分支
git checkout local
创建并切换分支
git checkout -b local -
切换分支时,即使索引或工作树与HEAD不同,也要继续,这用于丢弃本地更改;
检查索引中的路径时,不要在未合并的条目上失败; 相反,未合并的条目将被忽略。
git checkout -f master -
删除本地分支
git branch -d local -
删除远程分支和tag
git push origin --delete local
git push origin :branchname // 推送一个空分支到远程分支 -
删除tag这么用
git push origin --delete tag local
git push origin :refs/tags/tagname -
fetch之后需要和别人提交的代码合并,git rebase [仓库/分支],如:
git rebase origin/develop
如果有冲突,在解决冲突之后:
git rebase --continue -
草稿箱
对于本地修改后不提交,想切换分支最好stash一下,切回来再stash pop,这样可以接着修改东西继续搞,步骤:
git stash // 存草稿
git checkout 分支 // 切换分支
git stash pop // 切回到stash时的分支,使用git stash pop
或
git stash apply
git stash list // 查看草稿箱
git stash show [stash序号] // 显示某次草稿的具体文件 -
重命名远程分支
在git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支。 -
查看远程仓库信息
git remote show origin -
切换远程仓库地址
(1)修改命令
git remote set-url origin url
(2)先删后加
git remote rm origin
git remote add origin git@github.com:sheng/demo.git -
修改写错的commit message
(1)没有push到服务器,只是本地进行了commit
git commit --amend
(2)如果进行了新的commit
git reset --soft fb95cc86
git commit --amend -
项目被转移到另一个地址,要更新本地仓库的远程地址请运行 (ssh)
git remote set-url origin git@gitlab.xxx.cn:android/demo.git
或 http(s):
git remote set-url origin https://gitlab.xxx.cn/android/demo.git -
计算代码行数
git log --pretty=tformat: --since=2020-4-2 --until=2020-5-7 --numstat | gawk ‘{ add += $1 ; subs += $2 ; loc += $1 + $2 } END { printf “added lines: %s removed lines : %s total lines: %s\n”,add,subs,loc }’
2、操作步骤
- cd 文件名 // 进入仓库目录下
- git add . // 添加所有
- git commit -am // 提交
- git pull origin master // 同步服务器代码到本地
- i —> 写入提交日志 // 进入编辑模式
- ESC —>shirt + : —>wq // 退出编辑
- git push origin master // 同步至服务器
3、需要关注的操作
3.1 git merge 后如何撤销
// merge 后发现冲突太多,或者合并的分支代码并不是最新,那就直接撤销再合并好了
git reset --hard HEAD
3.2 git 配置 .gitignore 删除已提交的文件
(1)方式一
- 配置.gitignore,把不想提交的内容写进去
- 本地删除对应的内容,git push
- 本地再恢复此内容
(2)方式二
- 配置.gitignore,把不想提交的内容写进去
- 清空缓存后提交
git rm --cached -r .
git add .
git commit -am '注释'
- 确认无误后提交
git push
4、从git仓库提交代码到另一个git仓库
1, 首先添加仓库分支:git remote add
git remote add origin_repo_b git@server_ip:/path/repo_b.git
(origin_repo_b:自己起的名字,只要不与现有的 remote 名重复即可)
(git@server_ip:/path/repo_b.git:repo_b 的远程路径)
2, 将代码推送到repo_b.
git push origin_repo_b branch_a
origin_repo_b:远程 仓库 repo_b 的名字
branch_a:仓库 repo_a 的 branch_a 分支
3, 克隆仓库 repo_b,检查是否 push 成功
git clone git@server_ip:/path/repo_b.git
4, 参考
从git仓库提交代码到另一个git仓库
5、git merge 与 git rebase 的区别
(1)区别
- merge
在master分支上git merge deve,Git 会自动根据两个分支的共同祖先即e381a81这个commit和两个分支的最新提交即8ab7cff和696398a进行一个三方合并,然后将合并中修改的内容生成一个新的commit,即下图的78941cb
- rebase
在master分支上git rebase deve,Git会从两个分支的共同祖先master step1开始提取master分支(当前所在分支)上的修改,即master step2、master step3与master step4,再将master分支指向deve的最新提交(目标分支)即deve step2处,然后将master提取的修改依次应用到这个最新提交后面。不会像merge一样生成一个合并修改内容的commit,相当于把master分支(当前所在分支)上的修改在deve分支(目标分支)上原样复制了一遍,操作完成后的版本历史就像这样:
可以看见 master 分支从 deve 分支最新提交deve step2开始依次提交了自己的三个 commit(由于是提取修改后重新依次提交,故 commit 的 hash 码与上面的85841be、a016f64、e53ec51 不同)。
(2)冲突处理策略的不同
- merge遇见冲突后会直接停止,等待手动解决冲突并重新提交commit后,才能再次merge。
- rebase遇见冲突后会暂停当前操作,开发者可以选择手动解决冲突,然后git rebase --continue 继续,或者–skip跳过(注意此操作中当前分支的修改会直接覆盖目标分支的冲突部分),亦或 --abort直接停止该次rebase操作。
(3)学习链接
闲谈 git merge 与 git rebase 的区别
6、git commit 模板设置
(1)首先在任意路径下新建一个txt文件,文件内容如下:
[需求/BUG/其他]:
[描述]:
[备注]:
(2)进行设置模板
// 设置全局的模板,不管分支还是master都会有模板提示
git config --global commit.template C:\Users\Administrator\commit_template.txt
(3)设置编辑器
git config --global core.editor vim // core.editor后面跟的是要设置的编辑器 ,我这里设置的为vim
(4)如何查看是否设置成功呢?
(5)git commit 然后回车就会弹出我们设置的模板
(6)注意:上一次配置错了,一直提示错误,需要找到项目下的config文件,删了commit
(7)参考链接
Android开发之Git提交Template模板配置
git commit 模板设置
7、注意事项
- 经常提交,而且合并代码;
- 本地ver3-dev和远程的ver3-dev保持一致,不要rebase本地的local的代码到ver3-dev;
- 使用本地的ver3-dev rebase 远程的ver3-dev, 再在local rebase 本地的ver3-dev。
7、git日常操作
8、设置
8.1 Git Bash设置
8.2 conemu设置
9、SVN
10、问题分析
10.1 Git合并的时候,冲突问题:Merging is not possible because you have unmerged files
(1)问题描述
用git diff或者git status 查看哪些文件冲突,有冲突的会提示:
++<<<<<<< HEAD
++<<<<<<< new_branch
(2)解决方法
①修改你的冲突的文件,修改完之后,保存。
②用git add xxx,把你修改的文件全部都添加进去。
③最后,用git commit -a -m "备注信息" 提交,完成。
(3)学习链接
Git合并的时候,冲突问题Merging is not possible because you have unmerged files