git使用
撰写时间: 2018-10-10 总共: 3684 字 转载请注明: BY-SA 4.0(除特别声明或转载文章外)
git安装不再说明
git OSX版,windows版,Linux版
使用桌面版本(推荐)
GitHub Desktop管理项目
创建一个新仓库
# 创建一个文件夹
mkdir dir_name
# 进入文件夹
cd dir_name
# 执行命令创建一个新的仓库,当前目录下
git init
# 直接新建一个仓库
git init <project-name>
在windows下git文件是隐藏的
在github上创建一个新仓库
cd test
git init
# 创建一个readme.md文件并写入一个标题hello git
echo "# hello git" >README.md
# 添加文件进入缓存并提交
git add .
git commit -m "first commit"
# 接下来可以提交到远程服务器上
克隆一个仓库
# 克隆一个本地仓库
git clone /path/to/repository
# 克隆一个远程服务器上的仓库(常用)
git clone username@host:/path/to/repository
git clone <url>
git的工作流
本地仓库由git维护的3颗“树”组成。
-
工作目录(Working):拥有实际文件
-
缓存区(Index):临时保存你的改动
-
HEAD :指向最近一次提交的结果
- HEAD(头) HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点。 通常,理解 HEAD 的最简方式,就是将它看做 你的上一次提交 的快照
- Index (索引) 也可以被认为是staging area(暂存区),是一堆将在下一次commit中提交的文件,提交之后,它就是HEAD的父节点(git add添加的文件)
- working copy (工作副本) 当前工作目录下的文件(一般指,有修改,没有git add,没有git commit的文件)
添加与提交
# 添加计划改动到缓存区
git add <filename>
git add .
# 提交实际改动到HEAD
git commit -m "代码提交的信息说明"
# 提交时显示所有信息
git commit -v
# 提交自上次提交后的变化直接到仓库区
git commit -a
推送改动
# 从HEAD 推动到远程仓库
git push origin master(master可以更换为想要推送到的任何分支)
# 没有克隆现有的仓库,要连接到某个远程服务器可以使用
# 将改动推送到添加的服务器上
git remote add origin <server>
# 强制推送当前分支到远程仓库,即使冲突
git push origin <remote> -f
分支创建切换删除
创建仓库时,默认的分支是master
# 创建一个新命名为 feature_x 的分支
# 并从master 切换过去
git checkout -b feature_x
# 切换回master
git checkout master
# 列出所有分支
git branch <-r:所有远程分支> <-a:所有远程和本地>
# 删除分支
git branch -d feature_x
# 可以将该分支推送到远程服务器
# 否则仅为你自己可见
git push origin <branch>
更新和合并(拉取)
# 更新本地仓库到最新改动
git pull
# 显示所有远程仓库
git remote -v
# 合并其他分支到当前分支
git merge <branch>
git会尝试自动合并改动,但有可能不成功
出现冲突,需要手动修改文件合并
# 修改完毕后添加
git add <filename>
# 合并前查看改动 源分支和目标分支
git diff <source_branch> <target_branch>
恢复(重置)
重置(重置到这次提交)
# 替换本地改动
# 将使用HEAD的最新内容替换掉工作目录的文件
# 但是添加到缓存区的改动和新文件不受影响
git checkout -- <filename>
git checkout -- .(多个文件)
# 丢弃所有本地改动和提交
# 从服务器上获取最新的版本
# 将本地分支指向服务器
git fetch origin
git reset --hard origin/master
# 从暂存区撤销
# 回滚到指定的HEAD
# (某次提交,该提交后的所有提交会被回滚或者说不再存在,不可逆)
# 尽量不使用 reset
git reset --hard <HEAD 从日志获取指定的HEAD commit_id>
# 并强制推送到 master
git push -f origin master
# 重置暂存区指定文件与上次提交保持一样,不改变工作区
git reset <filename>
# 重置暂存区和工作区和上次提交保持一致
git reset --hard
# 重置当前分支到指定提交,同时重置暂存区和工作区
git reset --hard <commit_id>
# 重置当前HEAD为指定的提交,但保持暂存区和工作区不变
git reset --keep <commit_id>
恢复(提交回滚)
# 新建一个提交,用以撤销指定的提交
# 相当于用一个新的替换旧的提交,保持其他的记录
git revert <commit_id>
git reset 与 git revert的区别
重置,reset是一次重置操作,不可逆(其实还有版本穿梭,查看reflog再重置回去),HEAD 的长度会直接消退到某次重置的地方,相当于放弃后面的所有提交
恢复,是一个新覆盖操作,HEAD 会向后添加一个恢复提交用以覆盖之前指定的提交,相当于用一个新的提交覆盖指定的提交,其他的提交记录仍然存在。
标签
# 在当前提交,添加一个v1.0.0标签
git tag -a v1.0.0 -m "msg"
# 给指定提交添加
git tag v1.0.0 <commit>
# 查看 tag
git tag
# 删除
git tag -d v1.0.0
查看信息
日志部分
# 显示有变更的文件
git status
# 显示当前分支版本历史
git log
# 显示提交历史和每次提交发生变更的文件
git log --stat
# 根据关键词搜索提交历史
git log -S <keyword>
# 显示某次提交之后的变动,每个提交占据一行
git log <tag> HEAD --pretty=format:%s
# 显示符合提交说明的,某个提交之后的变动
git log <tag> HEAD --grep feature
# 显示某个文件的版本历史,包括文件重命名
git log --follow <filename>
git whatchanged <filename>
# 显示指定文件相关的每次diff
git log -p <filename>
# 显示过去几次的提交比如10次
git log -10 --pretty --oneline
# 显示所有提交过的用户,以提交次数排序
git shortlog -sn
# 显示指定文件是什么人什么时候修改过
git blame <filename>
差异查看
# 显示暂存区和工作区的差异
git diff
# 显示暂存区和上一个commit的差异
git diff --cached <filename>
# 显示两次提交之间的差异
git diff <first_branch> <second_branch>
# 显示今天写了多少代码
git diff --shortstat "@{0 day ago}"
查看提交
# 显示某次提交发送变化的文件
git show <commit_id>
# 显示某次提交发送变化的文件
git show --name-only <commit_id>
# 显示某次提交某个文件的内容
git show <commit_id>:<filename>
# 显示当前分支最近的提交
git reflog
配置
设置提交代码时的用户信息
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"
.gitignore文件
用以指定要忽略的文件,在提交项目的时候。而不是把所有目录下的文件都提交。
格式
注释: #
使用通配符指定
*.txt: 忽略所有.txt文件
!hello.txt: 不忽略hello.txt
忽略指定目录的文件
/text:忽略根目录下的text文件
docx/*.docx:忽略docx下的所有.docx文件
dist/:忽略所有dist目录下的文件
....等等
github上整理了一些项目的相关.gitignore文件配置
将需要的忽略文件重新命名为.gitignore就好。
通过gitignore.io 创建
自定义终端命令
https://docs.gitignore.io/install/command-line
获取对应的终端命令
使用自定义命令
# 获得针对node 项目的.gitignore文件
gi node > .gitignore