【软件工具】Git 使用总结
本地库就是由 对象
和 引用
构成的,或者叫 Repositories;
下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
- git help 命令查看命令用法。
一、新建代码库
# 在当前目录新建一个Git代码库 $ git init # 新建一个目录,将其初始化为Git代码库 $ git init [project-name] # 下载一个项目和它的整个代码历史 $ git clone [url]
二、配置
Git的设置文件为.gitconfig
,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
# 显示当前的Git配置 $ git config --list # 编辑Git配置文件 $ git config -e [--global] # 设置提交代码时的用户信息 $ git config [--global] user.name "[name]" $ git config [--global] user.email "[email address]" $ git config user.name "Mona Lisa" #设置当前 repository user名词 $ git config --global user.name "Your Name" $ git config --global user.email "[email@example.com]"
三、增加/删除文件
# 添加指定文件到暂存区 $ git add [file1] [file2] ... # 添加指定目录到暂存区,包括子目录 $ git add [dir] # 添加当前目录的所有文件到暂存区 $ git add . # 添加每个变化前,都会要求确认 # 对于同一个文件的多处变化,可以实现分次提交 $ git add -p # 删除工作区文件,并且将这次删除放入暂存区 $ git rm [file1] [file2] ... # 停止追踪指定文件,但该文件会保留在工作区 $ git rm --cached [file] # 改名文件,并且将这个改名放入暂存区 $ git mv [file-original] [file-renamed]
四、代码提交
- git版本管理与HEAD理解
使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。每个版本都会有自己的版本信息,如特有的版本号、版本名等。如下图,假设只有一个分支:
git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本;如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。
- git 多人提交时,存在本地和远程代码库不一致,解决办法如下:
git pull拉回操作中的合并:非快进式推送的非强制性的另一种解决办法,那就是先拉回在提交,这里的拉回其实包含了两个操作:获取远程仓库的数据,将本地数据进行合并。可以这样写:
git pull = git fetch + git merge
;默认情况下,合并后的结果会自动提交,我们可以通过设置选项来指定手动提交,通过命令:
git merge --no-commit <commit>...
模式可以指定合并先将结果放入暂存区,让用户手动对合并结果进行检查、更改,然后手动提交。
- 自动合并不会报错的几种情况
- 修改不同的文件
如果两个(或者多个,这里只介绍两个)用户user1/user2各自的本地提交中修改的是不同的文件,那么第二次进行合并推送的提交将能正确合并并提交,不会遇到任何麻烦- 修改相同文件的不同区域
首先需要说明的是,文件的修改是分区域的,可以具体到修改哪一行,通过命令cat > fileName.suffix进行逐行修改
当user1用户修改了index.txt文件的第一行第二行并进行提交与上游推送,然后user2用户同样修改了index.txt文件,不过修改的是第三行和第四行,然后在进行git pull命令,同样能正常合并,不会遇到任何麻烦- 同时更改文件名和文件内容
如果user1用户将index.txt文件移动到了index2.txt文件并删除index.txt(重命名的操作),并且进行了提交与上游推送,此时user2用户使用命令git pull获取并合并信息之后,会发现它同样也能正常合并,然后我们进行推送:git push origin master然后成功推送,接着我们查看一下远程仓库的内容,会发现git对这种情况的处理方式是:user2用户最终修改的是user1用户对应重命名后的文件
-
当两个用户同时修改同一个文件的相同区域的内容时,就会发生冲突事件了
git ls-files -s
,该命令输出的第二列的值如果为0表示对应的文件没有冲突,合并成功,如果不为0,则表示产生了合并的冲突,其中具体的值对应的意义是:1表示两个用户之前一个共同版本的对应文件内容;2表示当前用户对应的文件版本;3表示合并后的文件对应的远程版本git show :n:filename
查看对应文件的对应版本的内容;git mergetool
打开工具,默认git提供的是kdiff3,其中上方的三个界面从左到右依次为:两个版本的前一个共同版本的文件版本、当前本地版本的文件版本、合并后的文件版本- 如果只想要某一个版本,可以使用
git push -f
进行强行执行;
# 提交暂存区到仓库区 $ git commit -m [message] # 提交暂存区的指定文件到仓库区 $ git commit [file1] [file2] ... -m [message] # 提交工作区自上次commit之后的变化,直接到仓库区 $ git commit -a # 提交时显示所有diff信息 $ git commit -v # 使用一次新的commit,替代上一次提交 # 如果代码没有任何新变化,则用来改写上一次commit的提交信息 $ git commit --amend -m [message] # 重做上一次commit,并包括指定文件的新变化 $ git commit --amend [file1] [file2] ... git remote add origin https://github.com/liudongdong1/IBMWebSphereJavaEEdemo.git git push -u origin master 把本地库的内容推送到远程. 用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,**加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。从现在起,只要本地作了提交,就可以通过命令:$ git push origin master把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
同步更新已经存在的或folk之后的项目: 首先clone下来;
五、分支
# 列出所有本地分支 $ git branch # 列出所有远程分支 $ git branch -r # 列出所有本地分支和远程分支 $ git branch -a # 新建一个分支,但依然停留在当前分支 $ git branch [branch-name] # 新建一个分支,并切换到该分支 $ git checkout -b [branch] # 新建一个分支,指向指定commit $ git branch [branch] [commit] # 新建一个分支,与指定的远程分支建立追踪关系 $ git branch --track [branch] [remote-branch] # 切换到指定分支,并更新工作区 $ git checkout [branch-name] # 切换到上一个分支 $ git checkout - # 建立追踪关系,在现有分支与指定的远程分支之间 $ git branch --set-upstream [branch] [remote-branch] # 合并指定分支到当前分支 $ git merge [branch] # 选择一个commit,合并进当前分支 $ git cherry-pick [commit] # 删除分支 $ git branch -d [branch-name] # 删除远程分支 $ git push origin --delete [branch-name] $ git branch -dr [remote/branch]
六、标签
# 列出所有tag $ git tag # 新建一个tag在当前commit $ git tag [tag] # 新建一个tag在指定commit $ git tag [tag] [commit] # 删除本地tag $ git tag -d [tag] # 删除远程tag $ git push origin :refs/tags/[tagName] # 查看tag信息 $ git show [tag] # 提交指定tag $ git push [remote] [tag] # 提交所有tag $ git push [remote] --tags # 新建一个分支,指向某个tag $ git checkout -b [branch] [tag]
七、查看信息
git 命令代替gitk查看节点树
git log --oneline --graph --decorate --all
# 显示有变更的文件 $ git status # 显示当前分支的版本历史 $ git log # 显示commit历史,以及每次commit发生变更的文件 $ git log --stat # 搜索提交历史,根据关键词 $ git log -S [keyword] # 显示某个commit之后的所有变动,每个commit占据一行 $ git log [tag] HEAD --pretty=format:%s # 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件 $ git log [tag] HEAD --grep feature # 显示某个文件的版本历史,包括文件改名 $ git log --follow [file] $ git whatchanged [file] # 显示指定文件相关的每一次diff $ git log -p [file] # 显示过去5次提交 $ git log -5 --pretty --oneline # 显示所有提交过的用户,按提交次数排序 $ git shortlog -sn # 显示指定文件是什么人在什么时间修改过 $ git blame [file] # 显示暂存区和工作区的差异 $ git diff # 显示暂存区和上一个commit的差异 $ git diff --cached [file] # 显示工作区与当前分支最新commit之间的差异 $ git diff HEAD # 显示两次提交之间的差异 $ git diff [first-branch]...[second-branch] # 显示今天你写了多少行代码 $ git diff --shortstat "@{0 day ago}" # 显示某次提交的元数据和内容变化 $ git show [commit] # 显示某次提交发生变化的文件 $ git show --name-only [commit] # 显示某次提交时,某个文件的内容 $ git show [commit]:[filename] # 显示当前分支的最近几次提交 $ git reflog
八、远程同步
# 下载远程仓库的所有变动 $ git fetch [remote] # 显示所有远程仓库 $ git remote -v # 显示某个远程仓库的信息 $ git remote show [remote] # 增加一个新的远程仓库,并命名 $ git remote add [shortname] [url] # 取回远程仓库的变化,并与本地分支合并 $ git pull [remote] [branch] # 上传本地指定分支到远程仓库 $ git push [remote] [branch] # 强行推送当前分支到远程仓库,即使有冲突 $ git push [remote] --force # 推送所有分支到远程仓库 $ git push [remote] --all $ git reset [命令参数介绍] Head~1-9 --mixed 意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作 这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。 --soft 不删除工作空间改动代码,撤销commit,不撤销git add . --hard 删除工作空间改动代码,撤销commit,撤销git add . 注意完成这个操作后,就恢复到了上一次的commit状态 git remote add origin <REMOTE_URL> This associates the name origin with the REMOTE_URL. $You can use the command git remote set-url to change a remote's URL.
$ git remote -v# View current remotes> origin https://github.com/OWNER/REPOSITORY.git (fetch)> origin https://github.com/OWNER/REPOSITORY.git (push)> destination https://github.com/FORKER/REPOSITORY.git (fetch)> destination https://github.com/FORKER/REPOSITORY.git (push)$ git remote rm destination# Remove remote$ git remote -v# Verify it's gone> origin https://github.com/OWNER/REPOSITORY.git (fetch)> origin https://github.com/OWNER/REPOSITORY.git (push)
九、撤销
git commit --amend #用来修改commit 信息# 恢复暂存区的指定文件到工作区$ git checkout [file]# 恢复某个commit的指定文件到暂存区和工作区$ git checkout [commit] [file]# 恢复暂存区的所有文件到工作区$ git checkout .# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变$ git reset [file]#不删除工作空间改动代码,撤销commit,并且撤销git add . 操作$ git reset --mixed HEAD^# 撤销commit,不撤销git add . , 不删除工作空间改动代码$ git reset --soft # 撤销commit,撤销git add . , 删除工作空间改动代码$ git reset --hard# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变$ git reset [commit]# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致$ git reset --hard [commit]# 重置当前HEAD为指定commit,但保持暂存区和工作区不变$ git reset --keep [commit]# 新建一个commit,用来撤销指定commit# 后者的所有变化都将被前者抵消,并且应用到当前分支$ git revert [commit]$git revert HEAD 还原最近一次提交的修改:$git revert commit-id 还原指定版本的修改# 暂时将未提交的变化移除,稍后再移入$ git stash$ git stash pop#untracking files$ git clean
十、相关文件介绍
# 生成一个可供发布的压缩包$ git archive#使用 Git 的垃圾回收来进一步优化你的仓库。$ git gc --prune=now --aggressive
.1. 使用.gitignore文件track过滤
使用 .gitignore 文件[2] 就是这些最好的惯例之一。通过使用这个文件你可以告诉 Git 不要保存一些不需要记录的文件,如二进制文件、临时文件等等。
- Files with sensitive information
- Compiled code, such as
.dll
or.class
- System files like
.DS_Store
orThumbs.db
- Files with temporary information such as logs, caches, etc.
- Generated files such as
dist
folders
- 语法
# 表示此为注释,将被Git忽略*.a 表示忽略所有 .a 结尾的文件!lib.a 表示但lib.a除外/TODO 表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODObuild/ 表示忽略 build/目录下的所有文件,过滤整个build文件夹;doc/*.txt 表示会忽略doc/notes.txt但不包括 doc/server/arch.txt bin/: 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件/bin: 表示忽略根目录下的bin文件/*.c: 表示忽略cat.c,不忽略 build/cat.cdebug/*.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj**/foo: 表示忽略/foo,a/foo,a/b/foo等a/**/b: 表示忽略a/b, a/x/b,a/x/y/b等!/bin/run.sh 表示不忽略bin目录下的run.sh文件*.log: 表示忽略所有 .log 文件config.php: 表示忽略当前路径的 config.php 文件 /mtk/ 表示过滤整个文件夹*.zip 表示过滤所有.zip文件/mtk/do.c 表示过滤某个具体文件 被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。 需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:!*.zip!/mtk/one.txt 唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::/mtk/*!/mtk/one.txt 1048576000假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效!----------------------------------------------------------------------------------还有一些规则如下:fd1/*说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略; /fd1/*说明:忽略根目录下的 /fd1/ 目录的全部内容; /*!.gitignore!/fw/ /fw/*!/fw/bin/!/fw/sf/说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;注意要先对bin/的父目录使用!规则,使其不被排除。
#WindowsThumbs.dbehthumbs.dbDesktop.ini #过滤具体文件#C/C++*.d*.obj*.tlog*.lastbuildstate*.idb*.pdb*.swp#Python*.py[cod]*.so*.egg*.egg-infodistbuild#Java*.class*.jar#generated filesbin/ #过滤掉整个bin文件夹gen/#Eclipse Project Files.classpath.project.settings/#IntelliJ IDEA Files*.iml*.ipr*.iws*.ideaREADME.html
.2. config文件进行相应的配置
[core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true[remote "origin"] url = https://hub.fastgit.org/liudongdong1/blogbackup.git fetch = +refs/heads/*:refs/remotes/origin/*[branch "master"] remote = origin merge = refs/heads/master[branch "HEAD"] remote = origin merge = refs/heads/master
- git config --list --show-origin : 显示config文件中信息;
- 错误方式排查:刷新DNS缓存,ipconfig /flushdns;
文件冲突; remote-url 不可用; 上传文件过大,缓存不够
; - git config http.postBuffer 1048576000 ;10241024500 : 500M
- 设置git ssh 提交方式: git remote set-url origin git@gitee.com:github-25970295/photograph.git
十一、登录方式
.1. ssh
- 打开git bash 输入 $ssh-keygen -t rsa -C "你的邮箱地址 (例:jianshu@jianshu.com)",若不设置密码就一路回车
- 用记事本打开id_rsa.pub,得到ssh key公钥。
- 为github账号配置ssh key
切换到github,展开个人头像的小三角,点击settings,然后打开SSH keys菜单, 点击Add SSH key新增密钥,填上标题(最好跟本地仓库保持一致)。
.2. 针对个人经常使用记录
- git diff : 不加参数即默认比较工作区与暂存区; 查看修改的文件
git diff不加参数即默认比较工作区与暂存区
git diff --cached [<path>...]比较暂存区与最新本地版本库(本地库中最近一次commit的内容)
git diff HEAD [<path>...]比较工作区与最新本地版本库。如果HEAD指向的是master分支,那么HEAD还可以换成master
git diff commit-id [<path>...]比较工作区与指定commit-id的差异
git diff --cached [<commit-id>] [<path>...]比较暂存区与指定commit-id的差异
git diff [<commit-id>] [<commit-id>]比较两个commit-id之间的差异
【Android studio】git工具使用
选在工程目录,执行git init.
执行 git add .
通过 git commit -m "origin commit" 或commit 按键提交,所有文件此时有红变绿
通过push define remote URL为你在GitHub上创建repository 的url 地址,pull 到GitHub上
创建新的分支:
通过merge 合并修改操作;
原文地址:https://www.cnblogs.com/liu-dongdong/p/15117526.html
- Cross-Origin Resource Sharing协议介绍
- 战斗民族开源神器ClickHouse:一款适合于构建量化回测研究系统的高性能列式数据库(二)
- Microsoft StreamInsight 构建物联网
- 利用 Microsoft StreamInsight 控制较大数据流
- HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦
- 看看你是哪种级别的Python程序员(已跪)
- SignalR 在IE中无法工作 - Internet Explorer
- SQL Server 2012 中的 Service Broker功能的一些改进或增强
- 通用日志
- 数据包络分析教程
- 用JAVA的DEA算法衡量社交媒体页面的流行度
- 如何构建智能反垃圾邮件的WordPress插件
- 【深入研究】使用RNN预测股票价格系列一
- 【深入研究】使用RNN预测股票价格系列二
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 大点干!早点散----------使用Haproxy搭建web群集
- 嵌入式系统FreeRTOS — 互斥信号量
- 面试题系列第6篇:JVM字符串常量池及String的intern方法详解?
- 机器学习(一)——K-近邻(KNN)算法
- 机器学习(二)——K-均值聚类(K-means)算法
- windows下matplotlib的安装
- Python中常见的数据类型总结
- stm32中阻塞模式和非阻塞模式 in blocking mode 与 in non-blocking mode区别
- 机器学习(四)—决策树
- 机器学习(五)—朴素贝叶斯
- C语言面试题——位域及大小端模式的理解
- stm32添加串口调试
- STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印。(HAL库例程)
- 机器学习(六)— logistic回归
- 如果简化stm32中printf函数的使用——首先重定向