内容导读
一直以来,Git的使用只停留在简单的操作上。但是这种方式Git会尽可能的使用 Fast forward 模式,这种情况下,删除分支后,分支信息会一并删除。tag标签即为给 commit 操作产生的id值取的别名。添加后,远程仓库的名字就叫做origin, Git的默认叫法,也可以更改。/home/git/.ssh/authorized_keys 一行一个用户,如果没有该文件,手动创建即可。当前用户的配置文件在home目录的 .gitconfig ,可以直接修改文件。
一直以来,Git的使用只停留在简单的操作上。要得心应手的使用Git,必须了解点其他的东西。
配置个人信息
$ git config --global user.name "xxyangyoulin"$ git config --global user.email "xxyangyoulin@gmail.com"
查看提交日志
git log
git log --pretty=oneline #简略查看信息
git log --graph --pretty=oneline --abbrev-commit #查看分支信息
文件差别对比
git diff file
git diff filepath
工作区与暂存区比较
git diff HEAD filepath
工作区与HEAD ( 当前工作分支) 比较
git diff --staged 或 --cached filepath
暂存区与HEAD比较
git diff branchName filepath
当前分支的文件与branchName 分支的文件进行比较
git diff commitId filepath
与某一次提交进行比较
进行版本穿梭
在Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,往上写成HEAD~100
。
回上一版
git reset --hard HEAD^
此时git log
发现当前版本以后的版本消失。
想回到未来版本?未关闭窗口之前,找到版本号:
git reset --hard <版本号>
版本的跳转,HEAD如同一个指针,跳转不过是指针指向不同的版本。
HEAD指向哪个版本,当前版本定位就在哪儿。
但是找不到版本号了?
git提供了查看你的每一次命令的命令:
git reflog
撤销修改
git checkout -- changedFile
将会回到文件最后一次commit
或者add
时候的状态。
已经被你add
了?
撤销add
git reset HEAD file
这样add的文件就被撤销回到工作区了。
删除文件
-
工作区删除了文件并且确定也要删除版本库的该文件:
git rm hello.txtgit commit -m 'rm hello'
-
删错了?
git checkout -- hello.txt
恢复到最新版本。
进行分支管理
创建新的分支
git branch newbranch
切换到新分支
git checkout newbranch
创建并且切换
git checkout -b newbranch
查看当前分支
git branch
合并指定分支
git merge otherbranch
合并发生冲突,手动修改冲突文件并提交即可。
但是这种方式Git会尽可能的使用Fast forward
模式,这种情况下,删除分支后,分支信息会一并删除。
禁用Fast forward
模式?
git merge --no-ff otherbranch
--no-ff
可以保留之前的分支历史,能够更好的查看历史分支信息。而git merge
只保留单条分支记录。
gitmergenoff.png
删除指定分支
git branch -d otherbranch
推荐的是:创建一个分支完成一个任务,完成任务合并分支后删除完成任务的分支。
但是提示没有合并分支?
git branch -D otherbranch
强制删除。
储藏工作现场
工作途中,我们在A分支工作,当前任务未完成,没有添加到暂存区,但是需要紧急修复bug,使用:
git stash
储存现场,然后切换到需要修复bug的分支B。
接着,创建修复bug的分支C,完成修复任务,回到B分支,合并C分支,删除C分支。
然后,回到我们正在工作的A分支:
git checkout A
查看我们的工作现场:
git stash list
恢复工作现场?
git stash pop
此时会恢复并且删除stash的内容。
不删除stash内容?
git stash apply <指定stash,可以多次stash>
只执行恢复操作。
但是以后想删除?
git stash drop
执行删除stash内容的操作。
查看远程分支
git remote
git remote -v
将会显示更为详细的信息。
分支多人协作
其他人从服务器clone你的项目的时候,他默认只能在本地看到master分支,但是想切换其他分支进行工作?
git checkout -b work1 orgin/work1
在本地创建和远程对应的分支。
完成工作之后推送到服务器:
git push origin work1
此时其他人想要推送到work1就必须:
git pull
先拉取一下。
如果提示There is no tracking information for the current branch.
此时需要指定本地work1和远程work1分支的连接关系:
git branch --set-upstream work1 origin/work1
然后再执行拉取操作。
拉取之后,可能会发生冲突,手动解决即可。
tag标签的使用
tag标签即为给commit
操作产生的id值取的别名。
git tag <-s> v1.0 <-m "tag explain"> <commit id>
commit id
为空将会对应最新的commit
。
-s
秘钥签名标签。
-m
标签说明。
查看标签信息:
git taggit show v1.0
删除标签:
git tag -d v1.0
推送标签:
git push origin v1.0
推送全部:
git push origin --tags
删除推送了的标签:
git tag -d v1.0git push origin :refs/tags/v1.0
忽略文件
强制添加存在.gitignore
的文件
git add -f file.class
使用远程仓库
关联远程仓库
git remote add origin git@github.com:mnnyang/reponame.git
添加后,远程仓库的名字就叫做origin, Git的默认叫法,也可以更改。
关联之后,把本地的master分支所有内容推动到远程库上:
git push -u origin master
-u
参数:Git会把本地的master分支和远程的master分支关联起来,以后的推送和拉取就可以简化命令。
搭建Git远程服务器
-
首先肯定是要安装了Git才行啊。
-
创建一个专门用于运行git服务的用户:
sudo adduser git
-
把需要登录的用户的
id_rea.pub
添加到/home/git/.ssh/authorized_keys
一行一个用户,如果没有该文件,手动创建即可。 -
选择一个目录作为仓库,在该目录下:
sudo git init --bare sample.git
-
把仓库拥有者改为git用户:
sudo chown -R git:git sample.git
-
禁止shell登录,修改
/etc/passwd
git:......:/home/git:/usr/bin/git-shell
-
本地克隆使用了:
git clone git@serverip:/srv/sample.git
GitHub
生成key
ssh-keygen -t rsa
测试连接
ssh -T git@github.com
删除已关联的远程库
git remote rm origin
可以关联多个远程库
修改默认的远程库名称origin
即可。
自定义配置
命令别名
git config --global alias.st statusgit config --global alias.cm commitgit config --global alias.br branchgit config --global alias.ma 'push origin master'git config --global alias.unstage 'reset HEAD'git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
--global
是针对当前用户起作用。不加则只针对当前工作目录。
配置文件在.git/config
文件中。当前用户的配置文件在home目录的.gitconfig
,可以直接修改文件。
-
去官方网站学习更多:
git-scm