辅助命令
reset ,clear清屏,把git bash命令窗口中的所有内容清空。
ls -al 查看当前路径下内容
Vi / vim filename 编辑文件
mkdir doc 新建文件夹
echo “hello, world” > readme.txt 在文件夹下新建文件并在该文件中写入内容
第一部分:git 原理
第二部分:git实操
1、git配置
1)查看所有配置(显示当前的git配置)
git config -l (相当于 git config --list)
2)git配置文件分三个级别 system(系统级别)–>global(用户级别)–> local(当前仓库),底层配置会覆盖顶层
git config --system --list
git config --global --list
git config --local --list (注:该命令需要在git repository中执行)
3)编辑Git配置文件
git config -e --system
git config -e --global
git config -e --local (注:该命令需要在git repository中执行)
4)设置提交代码时的用户信息
git config --global user.name ‘your name’
git config --global user.email ‘your email’
5)日志时间格式化
git config --global log.date format:‘%Y-%m-%d %H:%M:%S’
2、git分支
git branch -h 分支帮助
git branch -a 查看所有分支 (remotes/origin/HEAD -> origin/master 表示默认分支)
git branch -a -vv 显示所有分支关联的远程分支
若遇到 git branch -a 无法全部显示远程的分支,可通过 git fetch 将本地远程跟踪分支进行更新即可
git branch -r 查看所有远程分支
git branch -a -vv --fromat=“(committerdate:short) %(refname:short)” 查看所有分支,最后一次提交时间
git branch --format: 格式化输出,用于自定义输出的格式
git branch --format=‘%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))’
git checkout -b test 新建test分支
git push origin test 建立远程分支test
git push -u origin test 创建分支推送到远程
git branch --set-upstream-to=origin/test 将新的test分支与指定的远程test分支建立追踪关系
git branch --set-upstream origin test 将本地分支与远程分支关联
git branch --set-upstream-to=origin/<branch> git checkout dev 切换到dev分支git branch -D test 删除本地test分支
git branch -d <branch_name> # 安全删除,只有当分支已经合并到其它分支时才会删除
git branch -D <branch_name> # 强制删除,不论分支是否合并都会被删除
git push --delete origin test 删除远程test分支git pull origin dev 从指定的远程分支pull代码
3、git历史
git log 显示当前分支的版本历史
git log -2 --oneline 或者 git log -2 --pretty=“oneline” 简要展示提交记录
git log -5 --reverse 按时间正序输出日志
git log -1 --stat 前n次提交, stat显示每次commit的文件修改统计信息
git log -p – src/main/java/com/imooc/passbook/test.java 显示指定文件相关的每一次diff
git log -1 --name-status name-status显示新增、修改、删除的文件清单
git log --grep=关键词 根据关键词搜索提交历史,例如 git log --grep=测试
git log --author=lisha 查找某一个作者所有提交
git log --pretty=“%h - %s” --since=“2019-01-24” --util=“2019-01-28” --author=lisha
git diff 显示暂存区和工作区的差异
git diff --cached 暂存区与本地版本库的差异
git diff HEAD 显示工作目录与git仓库之间的差异
git show <git提交版本号> <文件名>查询某个版本某个文件
git log master ^origin/master 查看已经commit但未push的内容
4、下载克隆项目、修改、提交、合并
1)从指定的分支检出项目(从dev分支检出项目)
git clone -b dev git地址例如:git clone -b dev https://gitee.com/xiaosha_git_oschina/passbook.gitgit pull 拉取代码git checkout src/main/java/cn/fl/project/dto/PrjContCfgDDTO.java 拉取指定文件的代码git status 显示有变更的文件git clean -nfd 删除untracked files(连 untracked 的目录也一起删掉, -n 参数先看看会删除掉哪些文件)git clean -nf 删除untracked filesgit add . 添加当前目录的所有文件到暂存区git add [dir] 添加指定目录的文件到暂存区git add [file1] [file2] ... 添加指定文件到暂存区git reset HEAD src/main/java/com/imooc/passbook/test.java 从暂存区撤销(撤销git add )git checkout -- src/main/java/com/imooc/passbook/test.java 撤销本地修改git commit -m 'ls-测试提交' 提交暂存区到仓库区
2)合并代码(注:合并完代码后需要提交)
git merge [branch] 合并指定分支到当前分支
git cherry-pick [commit] 选择一个commit,合并进当前分支,例如:git cherry-pick 0fd96fb76c28e4ede33aac3d21f4cedcdfa6aadbgit cherry-pick --abort 撤销当前的合并操作git checkout -p commit提交号
git checkout -p <branch> 文件名
Apply this hunk to index and worktree [y,n,q,a,d,/,e,?]? (是否将补丁加入暂存区, 键入y 加入)
git从其他分支合并某个文件到当前分支(注意文件路径,手写路径或手动定位到具体的文件夹)
直接覆盖合并: git checkout 分支 路径/文件名(全路径,绝对路径)
选择是否合并:git checkout -p 分支 路径/文件名 或 git checkout --patch 分支 路径/文件名
示例:
直接覆盖(从master分支合并进当前分支): git checkout master ReportPrintDto.cs
选择部分更改(从master分支合并进当前分支): git -p master ReportPrintDto.cs
合并代码失败,强制覆盖本地代码git fetch --all //只是下载代码到本地,不进行合并操作git reset --hard origin/master //把HEAD指向最新下载的版本git pullgit cherry -v 查看到未push的commit
3)撤销
撤销 git commitgit reset --hard e9f0108bbaf9ff1401b6acd846985284cb4935ad 撤销到指定的commit(适用于未push/已push两种情况)git reset --hard head 恢复到最后一次提交git reset --hard head^ 放弃提交,HEAD是指向最新的提交,上一次提交是HEAD^,上上次是HEAD^^,也可以写成HEAD~2 ,依次类推git reset --hard origin/master 放弃修改,强制覆盖本地代码(适用于未push的情况下)git reset -- 撤销 git push
git reset HEAD 撤销 git add
4)解决冲突:
git rebase --skipgit rebase --abortgit rebase origin/master git pull --rebase git push origin master
5)git切换分支时,会将未add或未commit的内容切换过去
问题出现的内容就是因为,我没有add ,而工作区和缓存区内容是公共的,不从属于任何一个分支,所以切换到A分支时,仍然将修改的东西带过去了;
当既想要在切换分支,又不想add时,可以使用git stash,当使用了git stash后,在其他分支仍然可以通过git stash pop找出来
git --help stash
6) 删除git库中untracked files(未监控)的文件
git clean -f 删除 untracked files
git clean -fd 连 untracked 的目录也一起删掉
git clean -xfd 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
在用上述 git clean 前,强烈建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd
7) git分支合并忽略配置文件
在项目根目录下新建文件.gitattributes,然后文件中写入需要忽略的文件名 + merge=ours, 一个文件占一行 例: 忽略config.xml 文件 config.xml merge=ours 如果设置了没有起效,在根目录下运行命令行 git config merge.ours.driver true 进行config配置 .gitattributes该文件主要是用于设置git对特定文件进行配置属性的,还可进行其他的配置
8) 修改本地分支名称并推送到远程
修改本地分支名称
git branch -m oldBranchName newBranchName
将本地分支的远程分支删除民
git push --delete origin :oldBranchName
将改名后的本地分支推送到远程,并将本地分支与之关联
git push --set-upstream origin newBranchName
9) 从指定的分支创建分支
git checkout -b 指定的分支
10)把dev分支合并到当前分支
切换到当前分支
git merge dev
11)检出远程分支到本地
git checkout -b 本地分支名字 origin/远程分支名
12)合并特定的提交记录
例如,想要将其它分支某个提交记录合并到master分支上:
首页切换到master分支
git cherry-pick [commit-id] 表示 将另一个分支的指定commit-id合并到当前分支
12)将其它分支的文件合并到当前分支上
git checkout master 切换到当前分支
git merge --no-commit --no-ff 其它分支 – path/to/file.txt
git checkout --patch 其它分支 src/pages/components/modal.tsx
这里选择处理方式:将此块应用于索引和工作树(输入 y
,按回车)
(1/3) Apply this hunk to index and worktree [y,n,q,a,d,j,J,g,/,s,e,?]? y
(2/3) Apply this hunk to index and worktree [y,n,q,a,d,j,J,g,/,s,e,?]? y
(3/3) Apply this hunk to index and worktree [y,n,q,a,d,j,J,g,/,s,e,?]? y
5、git图形化工具
图形化工具:gitk
解决gitk中文乱码,输入以下命令:
git config --global gui.encoding utf-8
查看某个文件的提交记录
gitk 文件全路径
例如:gitk ma-base-web/src/man/java/com/zqsy/zys/mabase/basecontroller/HqAuthController.java
6、git tag
创建tag
git tag -a v1.4 -m ‘my version 1.4’
查看tag
git tag查看标签信息与对应的提交信息
git show v1.4删除标签/删除远程仓库中的标签
git tag -d <tagname>
git push origin :refs/tags/v1.4-lw
7、清除git信息
进入项目目录:
清除原项目的git版本信息: rm -rf .git
去掉原仓库git地址: git remote rm
8、git stash暂存
暂存: git stash save “暂存的备注”
暂存记录: git stash list
取回暂存: git stash pop
取回指定的暂存: git stash apply stash@{0} stash@{0}需要先通过git stash list来查看
删除指定的暂存:git stash drop stash@{0}
清空暂存: git stash clear
9、git查看远程地址 与 设置远程地址
git remote -v
如果绑定好远程地址的话:
会有两条地址 fetch 和 push ,那么 fetch 表示我们要获取到的地址,push则表示我们要推送的地址。
添加远程地址:git remote add origin http://git.XXXX.com/XXX/XXX.git/
修改远程地址:git remote set-url origin http://git.XXXX.com/XXX/XXX.git/
第三部分:延伸阅读
1)使用 Git 来获取 Git 的升级:
$ git clone git://git.kernel.org/pub/scm/git/git.git
2)git submodule
git 的 四种对象commit,tree, blob ,tag
在git的世界里, 有四种类型的object, 分别是tree | blob | commit | tag
commit 存储一次提交的信息
tree 代表目录结构
blob 代表具体的某个文件
tag 标签,实际上就是commit的别名
每一次commit对应一个tree,这个tree又记录了整个文档的目录结构,文件的每一次修改又会生成一个blob,blob信息记录在tree下面。
看 .git/objects下面的内容
find .git/object -type f
git cat-file -t commit号 -t看类型
git cat-file -p commit号 -p看内容
第四部分:常见问题
git pull 报错:refusing to merge unrelated histories
git pull origin master --allow-unrelated-histories
在pull命令后紧接着使用–allow-unrelated-history选项来解决问题(该选项可以合并两个独立启动仓库的历史)。