本地库就是由 对象
和 引用
构成的,或者叫 Repositories;
下面是我整理的经常使用 Git 命令清单。几个专用名词的译名以下。php
- Workspace:工做区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
- git help 命令查看命令用法。
# 在当前目录新建一个Git代码库 $ git init # 新建一个目录,将其初始化为Git代码库 $ git init [project-name] # 下载一个项目和它的整个代码历史 $ git clone [url]
Git的设置文件为.gitconfig
,它能够在用户主目录下(全局配置),也能够在项目目录下(项目配置)。html
# 显示当前的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的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。若是没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的状况下会指向master,而master是指向最新提交)。每一个版本都会有本身的版本信息,如特有的版本号、版本名等。以下图,假设只有一个分支:android
git reset的做用是修改HEAD的位置,即将HEAD指向的位置改变为以前存在的某个版本;若是想恢复到以前某个提交的版本,且那个版本以后提交的版本咱们都不要了,就能够用这种方法。git
git revert是用于“反作”某一个版本,以达到撤销该版本的修改的目的。好比,咱们commit了三个版本(版本1、版本2、 版本三),忽然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就能够用 git revert 命令来反作版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。适用场景: 若是咱们想撤销以前的某一版本,可是又想保留该目标版本后面的版本,记录下这整个版本变更流程,就能够用这种方法。github
git pull拉回操做中的合并:非快进式推送的非强制性的另外一种解决办法,那就是先拉回在提交,这里的拉回其实包含了两个操做:获取远程仓库的数据,将本地数据进行合并。能够这样写:
git pull = git fetch + git merge
;shell默认状况下,合并后的结果会自动提交,咱们能够经过设置选项来指定手动提交,经过命令:
git merge --no-commit <commit>...
模式能够指定合并先将结果放入暂存区,让用户手动对合并结果进行检查、更改,而后手动提交。json
- 修改不一样的文件
若是两个(或者多个,这里只介绍两个)用户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下来;android-studio
# 列出全部本地分支 $ 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 --allbash
# 显示有变动的文件 $ 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
使用 .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
[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
文件冲突; remote-url 不可用; 上传文件过大,缓存不够
;切换到github,展开我的头像的小三角,点击settings,而后打开SSH keys菜单, 点击Add SSH key新增密钥,填上标题(最好跟本地仓库保持一致)。
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之间的差别
选在工程目录,执行git init.
执行 git add .
经过 git commit -m "origin commit" 或commit 按键提交,全部文件此时有红变绿
经过push define remote URL为你在GitHub上建立repository 的url 地址,pull 到GitHub上
建立新的分支:
经过merge 合并修改操做;