Git常用命令

Git常用命令

git config可以配置git的参数,可以使用git config --list查看已经配置的git参数。其中有三个级别的保存位置,--system--global--local,分别表示所有用户(本系统)、当前用户(全局)、本地配置(当前目录),默认使用--local

工作区(working diretory) 用于修改文件

缓存区(stage) 是用来暂时存放工作区中修改的内容

提交历史(commit history) 提交代码的历史记录

主要的几个命令
git add # 将工作区的修改提交到暂存区
git commit # 将暂存区的修改提交到当前分支
git reset # 回退到某一个版本
git stash # 保存某次修改
git pull # 从远程更新代码
git push # 将本地代码更新到远程分支上
git reflog # 查看历史命令
git status # 查看当前仓库的状态
git diff # 查看修改
git log # 查看提交历史
git revert # 回退某个修改
1.Git基本配置

配置用户名及邮箱

在使用Git提交前,必须配置用户名和邮箱,这些信息会永久保存到历史记录中。

git config --global user.name "Tocy"
git config --global user.email zyvj@qq.com

其他配置

如果在windows下建议还是配置下默认文本编辑器core.editor和差异分析工具merge.tool

2. 创建Git仓库

初始化当前目录,即创建Git仓库。

git init
3. 获得Git仓库

如果需要克隆远程仓库,可以使用git clone

git clone https://git.oschina.net/Tocy/SampleCode.git
4. 提交更新

在windows下的Git GUI中,右键-TortoiseGit-Commit。
Git中每个文件都有三种状态:committed、staged、modified。它们之间关系如下:

commit <-- stage <-- modify
commit --> --- --modify

​ 我们获取的Git仓库中的所有文件都是committed状态,如果你在本地修改了文件a,a的状态就变成modified的;如果使用git add a,a的状态变成staged;如果使用gitcommit,a的状态就变成commited。这种状态变化也说明复制代码是很方便的,但是提交更新请慎重。 当然还有一种文件状态,未跟踪状态(unversioned/untracked),通过使用git add可以把未跟踪状态变更为staged;通过git rm可以将staged或者committed状态变为未跟踪状态。

git status

通常提交前先检查下修改了什么内容,当前Git目录下各文件的状态。

$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Readme.md

nothing added to commit but untracked files present (use "git add" to track)

git add

git add可以添加文件或者目录,也可以使用通配符

git add Readme.md    # add file only
git add *.cpp        # add all cpp files
git add /home/code/  # add all files in /home/code
git add -A           # 保存所有的修改
git add .            # 保存新的添加和修改,但是不包括删除
git add -u           # 保存修改和删除,但是不包括新建文件。

git diff

git diff可以查看当前目录的所有修改。
提交之前,还是单独确认下处于staged状态的文件有哪些,并保证修改正确。在实际应用中,可能还需要使用git diff导出PATCH做代码走读。
可以使用git diff --stagedgit diff --cached查看staged与上次提交快照之间的区别。

git commit

​ 提交前需慎重。直接调用git commit会弹出编辑器,输入提交日志(如果是多行日志,建议使用)。
针对单行日志提交的情况,可以使用如下命令:

git commit -m "add readme"   #单行日志提交
git commit -a     

git rm

git rm会把文件从当前目录删除(不会保存删除的文件)。

​ 如果需要从Git仓库中删除,但保留在当前工作目录中,亦即从跟踪清单中删除,可以使用git rm --cached readme.md

git stash

$ git stash
所有未提交的修改都保存起来,用于后续恢复当前工作目录

$ git stash save "stash_name"
给每个stash加一个message,用于记录版本

$ git stash pop / git stash apply
恢复最新缓存的工作目录(第一个),并删除缓存堆栈中的那一个stash删除(pop), apply则只恢复不删除

$ git stash list
查看现有所有stash
在使用git stash pop(apply)命令时可以通过名字指定使用哪个stash,默认使用最近的stash(即stash@{0})

$ git stash drop
移除最新的stash,后面也可以跟指定stash的名字
5. 提交历史查看

可以使用git log查看当前工程的所有提交的日志。

git log --stat      # 仅显示摘要选项
git log --pretty=oneline        # 定制记录格式
git log --graph     # 图像化分支和版本更新
6. 撤销更新
7. 远程仓库

可以使用git remote查看当前的远程库。

git remote -v        #可以显示对应的克隆地址。(对于多个远程仓库很有用)

添加远程仓库

git remote add [short_name] [url]可以添加新的远程仓库。

从远程仓库抓取数据

git fetch [remote-name]可以从远程仓库抓取数据到本地。
git pull

推送数据到远程仓库

  git push [remote_name] [branch_name]      #默认使用origin和master。
$ git push <远程主机名> <本地分支名>:<远程分支名>
$ git push origin master

上面命令表示,将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。

$ git push origin :master
# 等同于
$ git push origin --delete master

上面命令表示删除origin主机的master分支。如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。

 $ git push origin

上面命令表示,将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略。

$ git push

如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push

$ git push -u origin master

上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

将当前分支推送到远程的同名的简单方法,如下:

$ git push origin HEAD

将当前分支推送到源存储库中的远程引用匹配主机。 这种形式方便推送当前分支,而不考虑其本地名称。如下:

$ git push origin HEAD:master

单独使用git push时,没有指定push的remote分支名,假如当前本地分支名称与其对应的remote分支名称不一样,则会有一下提示:

fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:my_new_test_branch

To push to the branch of the same name on the remote, use

    git push origin test

To choose either option permanently, see push.default in 'git help config'.

当执行git push origin test时,会在远程重新创建一个新的分支,名称就是test,然后把修改同步到test分支。

查看远程仓库信息

git remote show origin

远程仓库的删除和重命名

git remote rename [old_name] [new_name]
git remote rm [remote_name]
8. 打Tags

可使用git tag显示当前库中的标签。

添加标签(含附注)

git tag -a v0.1 -m "my version 0.1"

使用如下命令查看Tag日志信息(指定对应标签的名字)

git show v0.1

也可使用SHA-1的提交表示创建tag:

git tag -a v0.2 [SHA-1] -m "my version 0.2"

分享标签

默认的,git push不会推送标签信息到远程仓库,需要通过命令显式推送。

git push origin v0.1

如果需要推送所有标签,使用

git push origin --tags
9. Git分支

git分支是轻量级的,速度很快,仅记录索引信息。

显示所有分支

git branch     #可显示当前所有分支
git branch --merged master      #列出合并到母版中的分支
git branch --merged   #列出合并到HEAD中的分支(即当前分支的尖端)
git branch --no-merged    #列出尚未合并的分支

创建及切换分支

可以使用下面命令直接切换并创建分支

git checkout -b testing
等价于
git branch testing    # 创建testing 分支
git checkout testing  # 切换到testing分支
git checkout -- fileName
这条命令把fileName从当前HEAD中检出,也就是回退当前工作区的这个文件的修改--可以省略不写

git checkout --hard HEAD
回退工作区的全部文件修改,不需要对每个文件进行checkout

注意切换分支时请保持工作目录没有未提交的修改。Git鼓励使用分支,处理完问题之后合并分支即可。

分支合并

将hotfix分支合并到master(主分支)上,需要通过下面命令:

git checkout master
git merge hotfix

合并之后可以使用git branch -d hotfix删除分支。 如果合并时存在冲突,需要手工修改。

删除分支

$ git branch -d branchName 
  git branch -D branchName 删除分支
  (不管它有没有merge)前提是先要切换到其他分支

$ git branch -d branch1

error: The branch 'branch1' is not fully merged.
If you are sure you want to delete it, run 'git branch -D branch1'.
代码提交完整流程

步骤如下:
git add -A
git commit -m “message”
git pull --rebase (或者git fetch + git rebase)
解决冲突
git add 冲突文件
git rebase –continue
git push
其中,3、4、5点,如果没遇到冲突就不用进行,直接push上去。
当遇到冲突时,git会提示patch failed,并要我们解决问题了再执行git rebase --continue

git解决代码提交冲突

树冲突 文件名修改造成的冲突,称为树冲突。 比如,A同事把文件改名为A.C,B同事把同一个文件改名为B.C,那么B同事将这两个commit合并时,会产生冲突。 如果最终确定用B同事的文件名,那么解决办法如下:

git rm A.C

git rm origin-name.C

git add B.C

git commit

如果最终确定用A同事的文件名,那么解决办法如下:

git rm B.C

git rm origin-name.C

git add A.C

git commit

内容冲突(git pull拉取最新代码发现)

一般来讲,出现冲突时都会有“CONFLICT”字样,特别的直接报错repo sync的报错,可能并不是直接提示冲突 现在,需要进入报错的项目(git库)目录,然后执行git rebase解决:

git rebase remote -branch-name

冲突解决的一般步骤

merge/patch的冲突解决

先编辑冲突,然后git commit提交。

对于git来讲,编辑冲突跟平时的修改代码没什么差异。修改完成后,都是要把修改添加到缓存,然后commit。

rebase的冲突解决

rebase的冲突解决过程,就是解决每个应用补丁冲突的过程。 解决完一个补丁应用的冲突后,执行下面命令标记冲突已解决(也就是把修改内容加入缓存)

git add -u

-u 表示把所有已track的文件的新的修改加入缓存,但不加入新的文件。 然后执行下面命令继续rebase:

git rebase --continue

有冲突继续解决,重复这这些步骤,直到rebase完成。 如果中间遇到某个补丁不需要应用,可以用下面命令忽略

git rebase --skip

如果想回到rebase执行之前的状态,可以执行:

git rebase --abort

注:rebase之后,不需要执行commit,也不存在新的修改需要提交,都是git自动完成。 直接编辑冲突文件:

冲突标记<<<<<<< (7个<)与=======之间的内容是我的修改

=======与>>>>>>>之间的内容是别人的修改

最简单的编辑冲突的办法,就是直接编辑冲突了的文件(test.txt),把冲突标记删掉,把冲突解决正确。

此时,还没有任何其它垃圾文件产生。

利用图形界面工具解决冲突

如果要解决的冲突很多,且比较复杂,图形界面的冲突解决工具就显得很重要了。

执行git mergetool用预先配置的Beyond Compare解决冲突:

界面三个窗口依次是“LOCAL”、“BASE”、“REMOTE”,它们只是提供解决冲突需要的信息,是无法编辑的。

下面一个窗口是合并后的结果,可以手动修改,也可以点击相应颜色的箭头选择“LOCAL”或者“REMOTE”。

在Beyond Compare中修改冲突保存后,冲突文件(test.txt)中的冲突标记就没有了,成了修改后的内容,一个文件的冲突编辑就完成了。

注意:启动Beyond Compare之后,会自动生成几个包含大写字母名称、数字的辅助文件 关闭Beyond Compare时,这几个辅助文件都会自动删除,但同时会生成一个test.txt.orig的文件,内容是解决冲突前的冲突现场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值