git 常用命令:
-
git init: 初始化一个git, 然后可以使用git 指令。 一般开发中已经完成,日常会很少使用。
-
git clone: 从现有的git repository 拷贝一份
git clone [url]
$ git clone https://github.com/xinge.hu/git-test /* 将远程仓库克隆到本地,本地项目名称为仓库名称*/
$ git clone https://github.com/xinge.hu/git-test another-runoob-name /*将远程仓库克隆到本地, 本地项目名称自定义为another-runoob-name*/
$ git clone -b hxg_br gitolite3@192.168.10.00:xxx_BASE /* 后面是仓库名称,前面是仓库对应的分支名称*/
-
git config: 修改git 的配置,通常是用户名称,或邮箱地址:
**配置种类:**system : /etc/.gitconfig ; global: ~/.gitconfig; local: .git/gitconfig
常用配置指令:
- git config --global user.name “xinge.hu”
- git config --global user.email “72qq.com”
- git config --list
配置建议:
-
alias : 缩短指令集, 设置方法示例:
-
commit 的模板:设置方法示例:
-
color:不同状态文件采用不同颜色,设置方法示例:
-
pager : 主要设定一个tab 是几个空白,便于git diff 时查看。设置方法示例:
-
.gitignore file:可以修改该文件,将一些.o 或者.a 不追踪的文件忽略。
-
git status: 查看各个文件的状态
-
git diff: 比较文件的差异
常用命令:
- git diff : 比较工作区与暂存区的差异
- git diff --cached : 比较暂存区与上一次提交的所有差异
- git diff filename: 比较工作区与暂存区有关filename 文件的差异
- git diff 比较两个提交的差异
- git diff :filename :filename 比较两个提交中关于filename的差异
- git diff filename: 比较两个提交中关于filename 的差异。
-
git log : 将当前提交的commit 显示出来
- git log -n :查看最近的几个log
- git log -p:列出详细信息
- git log --stat : 列出log 的具体修改状态,比如哪些文件增加几行等
- 也可以使用gitk 工具直接查看。
-
git add: 文件加入暂存区,或添加为追踪
- git add
- git add -A
-
git commit: 提交暂存区修改
- git commit -m “提交信息”
- git commit 默认提交
- git commit --amand : 如果修改相同则修改上次提交log信息,如果修改不同则合并提交到上一次提交上。
-
git push :将本地提交更新到远程分支
$ git push <远程主机名> <本地分支名>:<远程分支名>
$ git push origin master /*将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。*/
$ git push origin :master /*无本地分支名,则是直接删除远程分支*/
$ git push origin --delete master /*直接删除远程master 分支*/
$ git push origin /*将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略。*/
本地
git push ssh://xinge.hu@172.23.3.72:29418/sphe8269/linux/sdk/wifi/drivers/xxx HEAD:refs/for/master
参考网址:git push 理解
-
git push remote branch
-
git branch:显示分支
-
git branch -a -r : 查看所有分支
-
git branch -d xxx // 删除本地分支名
-
git branch -D xxx //强制删除本地分支
-
git push origin -d xxx //删除远程分支xxx
-
git pull: 将远程分支修改整合至本地存储库
-
git pull = git fetch + git merge
-
git pull --rebase: 为避免产生新的节点(该节点有两个父节点),预设会使用该指令;示例如下:
-
-
git checkout: 切换分支,或将某个工作区文件还原为上一次commit 时,或者将当前分支还原为最新comit
-
git checkout < file> : 工作区某个文件还原。(用.git 中文件覆盖工作区对应的文件)
-
git checkout [commit id] 文件 : 将文件还原到指定commit id 处
-
git checkout -p < file>: 分区还原某个文件,可以使用y/n 保留或还原
-
git checkout< branch>: 切换分支
-
git checkout -b xxx(创建的分支名) original/xxx(远程分支名)
-
git checkout HEAD
-
-
git rm < file> : 从git 中删除某个文件
-
git mv < file> < newfile>
-
git reset HEAD: 还原修改,接不同的参数,还原后的内容不同:
- git reset HEAD : 会拉回最新commit, 但修改会保存在未为暂存的修改
- git reset HEAD --soft: 将修改还原为暂存状态,没提交
- git reset HEAD --hard: 将commit 拉回commit 状态,相关修改全部丢弃。
git reset HEAD和git checkout HEAD 不同:
- git checkout 的结果,.git/HEAD 被修改,但.git/refs/heads/master 下的内容不会被修改。
- git reset 的结果,.git/HEAD 被修改,.git/refs/heads/master 下的内容也一同被修改。
^参数和~参数:HEAD 的前n个commit
HEAD^^=HEAD~2
-
git merge 指令:
- git merge < branch> : 将某个开发分支merge 到当前分支 // 会产生新的节点
- git merge --no-ff < branch>: 将某个开发分支merge到当前分支,但不产生新的节点
-
git cherry-pick < sha1> --no-commit : 摘樱桃方式截取过来,–no-commit 只会将采摘内容保存至暂存区,不会提交,检查无误后可以提交。
-
git rebase -i指令:
作用:1. 重新将commit 进行排序 2. 修改n前commit log
- git rebase -i > 叫出互动界面(互动界面,最下面的pick 最新)=》调换commit ==》文件保存退出,自动就会调用commit 顺序。
- git rebase -i==>叫出互动界面==》要修改的commit 前改为edit,文件保存退出==》git log 查看==》git commit --amend 修改commit message==>git rebase --continue commit 顺序还原且commit 信息已修改。
-
git stash 指令:
- git stash :本地工作区有修改,git pull 时就会报出未保存的修改,此时就可以是用git stash 暂存修改
- git stash list: 列出所有的暂存修改 , x 为暂存的序列号
- git stash pop x: 将git stash 暂存的修改重回工作区
- git stash drop: 将git stash 暂存的修改丢弃。
-
git blame 指令:
- git blame : 将某个文件的每一行是谁修改的列出来
- git blame -L 100,200 : 将某个文件的100line-200line 的最后一次修改者罗列出来。
-
创建patch 指令:
- git diff > xxx.patch // 将diff 内容打包成一个patch
- git format-patch -n < commit> //将某个提交commit 导入到一个档案
git format-patch -3 //从当前分支最新提交点往下共生成3个补丁
git format-patch -1 指定commit号 //生成指定commit号的补丁
-
应用patch 指令:
- git apply --check xx.patch //应用某个patch 但不提交
- git am xxx.patch //应用某个patch并包含commit 信息
-
git diff UI:
- git config --global
- diff.tool bc3
- difftool.prompt false
- difftool.bc3.path C:/programe/beyond compare 3/bcomp.exe
- difftool.bc3.trustexitcode false
- git config --global
2、 常用sop:
2.1 git pull 冲突解决:
-
用户A 下软件修改了File1,然后push 时,远程的File1 已被其它用户修改并提交。此时修改会出现冲突:解决冲突方法如下:
-
local branch 中git pull //更新远程分知道local
-
local branch 打开冲突文件,解决冲突:
<<<<<<HEAD
==========
">>>>>>>>>
//根据实际逻辑解决冲突
-
locak branch 将解决完冲突的文件执行git add 冲突file
-
locak branch 执行git rebase --continue
-
2.2 cherry pick 冲突解决:
- base file 不一致,cherry pick 时失败,解决冲突方法如下:
-
local branch 打开冲突文件, 解决冲突:
<<<<<<HEAD==========
">>>>>>>>>
//根据实际逻辑解决冲突
- local branch 将解决完冲突的文件执行git add 冲突file
- local branch 执行git commit 对应就会提交。
2.3 如何将当前修改整合至之前的commit 提交:
- git stash 保存当前工作空间的改动
- git rebase <指定commit 的父commit id> --interactive
- 将需要改动的commit 前面的pick 改为edit保存退出
- git stash pop 将暂存的修改还原到工作区
- git add -u 将工作区更改的文件加入暂存区
- git commit --amend 重新修改上一笔commit
- git rebase --continue 继续rebase
- 如果有冲突则解决冲突,然后git add <更改的文件>,再git commit --amend ,然后git rebase --continue.
2.4还原修改的方法:
2.4.1 还原工作区的修改(未使用git add )
- git checkout – filepathname //放弃修改某个文件
//比如: git checkout hxgtest1.cpp - git checkout . //放弃所有修改的文件。
- git restore . //放弃所有修改的文件。
2.4.2 还原暂存区的修改(已经使用git add)
//以下指令是将暂存区的文件还原到工作区,并保存修改内容。
- git reset HEAD filepathname //恢复某个文件到工作区,此时工作区包含修改内容。
// 比如git reset HEAD hxgtest.cpp - git reset HEAD . //注意最后的“.”, 恢复所有文件到工作区。
- git reset //恢复所有文件到工作区
2.4.3 还原版本区的修改(已经使用git commit 提交)
1. 全部撤销并回到仓库最新状态,不保存代码修改。
- git reset --hard HEAD^ //回退打上一次commit 状态
- git reset --hard commit_id //会退到某个版本id 的commit
2. 如果想撤销暂存区,工作区,版本区到远程分支最新状态,且不保存代码修改。
- git fetch --all
- git reset --hard origin/master //git reset --hard origin/远程分支名
3. 如果想版本区修改拉回工作区并保存修改。(即撤销git commit & git add)
- git reset --mixed HEAD^
- git reset HEAD^
4. 如果想版本区修改拉回暂存区(即只撤销git commit,修改在暂存区)
- git reset --soft HEAD^
2.4.4 撤销远程分支的commit (已经使用git push )
1. 还原最新修改并提交,远程分支会产生新的commit id
- git revert HEAD
- git push origin 分支名
// 比如 git revert HEAD git push origin master
2. 回退上一版本并提交
- git reset --hard HEAD^ //回退到上一个版本
- 或git reset --hard commit_id //回退到某个commit id 版本
- git push origin HEAD --force //强制推送到远程,可能会受到保护。