git基础
分布式版本管理系统
客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份
git的基本概念
-
工作区 你工作的代码
-
暂存区 所有的工作代码都有index对应,
-
版本库 远端服务器上的代码
-
HEAD :
当前活跃分支的游标,可以用 checkout 命令改变 HEAD 指向的位置。
形象的记忆就是:你现在在哪儿,HEAD 就指向哪儿,所以 Git 才知道你在那儿! -
origin:
默认的远程仓库的名字 -
master:
首次创建仓库时默认分支的名字,在大多数情况下,master是指主干分支。
HEAD是git内置的定义好的特定含义功能,不可以修改。master,origin都是常用的公共命名方式,可以有自己的定义。
git查看信息操作
- git log -p -数字(1,2,3,4)
我们常用 -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新 - git log 查看提交信息
- git status查看本地改动
- git diff查看具体修改的地方
git提交操作
- git add . 加入本地新增所有文件
- git add 具体文件路径加入文件
- git commit -m "提交并填写信息"
- git commit -a -m "跳过暂存区"
- git fetch 远程仓库名
- git push [remote-name] [branch-name]
- git push [remote-name] master:master
将本地的master分支推送到远端的master分支,如果没有就新建一个 - git stash
当你不想commit的时候
注意切换分支一定要commit或stash保存一下
- git stash pop 恢复改动
- git stash list 查看stash列表
- git stash pop/apply [<stash>]
恢复stash列表中的id
stash@{0}: WIP on master: b7ba44d 初始化
stash@{1}: WIP on master: b7ba44d 初始化
stash@{2}: WIP on master: b7ba44d 初始化
git stash pop stash@{0}
apply与pop的区别是,apply会保留暂存区的id,pop会删除暂存区的id
git移除以及放弃修改
- git check out 文件路径
- git rm 文件路径
- git rm --cached readme.txt 只从暂存区中移除
远程仓库
git remote -v 查看所有远程仓库
git remote rename 远程仓库 新远程仓库
重命名操作
git拉取操作
- git fetch:
相当于是从远程获取最新版本到本地,不会自动merge
git fetch 远端仓库名 远端分支名 - git pull:
git pull origin/master
拉取远程master分支到本地master分支上
实际操作中fetch更安全一些
git log
- git log --oneline --graph:可以图形化地表示出分支合并历史.
- git log --oneline
git diff
- git diff [branchA] [branchB] 比较两个分支的改动
- git diff commitid commitid 比较两个commit的改动
- git diff HEAD比较工作区和上次提交之间所有的改动.
git分支操作
- git branch -vv 查看本地分支对应的远程分之
- git branch -a 查看所有分支列表,包括本地和远程
- git branch -d 某某 删除某某分支
- git branch 分支名
- git checkout 转换分支
merge与rebase用法区别
merge简单,保留了提交历史和时间次序,但是提交历史被大量的 merge 提交污染了
rebase把复杂的历史变成优雅的提交线,清除烦人的 merge 提交。
rebase 把所有的提交压缩成一个 “patch”。然后把 patch 添加到目标分支里。
本地开发:如果你没有和别人协同工作,使用rebase更好
- git merge upstream/master 远端仓库名/远端分支 默认合并到当前分支上
- git rebase master
- rebase解决冲突
- 冲突解决完之后,使用git add <file-name>来标记冲突已解决,最后执行git rebase --continue继续。如果中间遇到某个补丁不需要应用
- git rebase --abort
- rebase执行之前的状态
git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
- git revert只会删除具体的commit内容
- git reset会将你commit之前的全部删除
- git reset -- hard与mixed默认的区别
hard是修改所有工作区暂存区而mised只是修改暂存区还需要你checkout - 注意git revert之后线上代码的commit内容也删除,revert一般不会造成冲突,reset一般会有冲突
- git revert
mBtnTest = findViewById(R.id.btn_test);
mBtnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
git commit 提交了一个点击事件
在push之前 revert这个commit id 在git log中会出现一个
commit 9cd94ec870c124ec8ac2362acba6bd0926f66b70
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 13:12:12 2017 +0800
Revert "增加点击事件"
This reverts commit d8cd57fcee4cad1e234c2af22784534a1234f4fa.
但是在你push之后,该提交内容会被移除
mBtnTest = findViewById(R.id.btn_test);
- git reset
强制返回某次提交,并将之前的commit信息全部删除,本地代码也回到reset的指针位置
增加点击事件
commit 9cd94ec870c124ec8ac2362acba6bd0926f66b70
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 13:12:12 2017 +0800
Revert "增加点击事件"
This reverts commit d8cd57fcee4cad1e234c2af22784534a1234f4fa.
commit 56c3e78df3dfbcdd8ce5176c82077fcd1da6241d
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 13:11:20 2017 +0800
Revert "添加检查权限的方法"
This reverts commit 3e75bb4aac34ae8b8bfc68aa189bbe376bd3ec01.
commit 3e75bb4aac34ae8b8bfc68aa189bbe376bd3ec01
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 13:08:37 2017 +0800
添加检查权限的方法
commit d8cd57fcee4cad1e234c2af22784534a1234f4fa
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 13:02:02 2017 +0800
增加点击事件
commit d901a91f3d2701f47bdc43bc8eff1acb9fadf7b2
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 12:56:05 2017 +0800
git reset --hard 3e75bb4aac34ae8b8bfc68aa189bbe376bd3ec01添加权限方法
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 13:08:37 2017 +0800
添加检查权限的方法
commit d8cd57fcee4cad1e234c2af22784534a1234f4fa
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 13:02:02 2017 +0800
增加点击事件
commit d901a91f3d2701f47bdc43bc8eff1acb9fadf7b2
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 12:56:05 2017 +0800
增加initdata方法
commit b7ba44dbae68661d940e68bab2da0dafe91dff30
Author: cuiqiang <cuiqiang>
Date: Sat Nov 25 12:49:07 2017 +0800
初始化
git chery-pick
可以将其它分支的commit提交,提交到自己的分支上
然后可以用git rebase改变提交顺序
git 忽略
- bin/ 该文件夹下的所有内容都会被忽略,但是不忽略bin文件
- /bin 忽略根目录下的bin文件
- *.iml 表示忽略所有 .iml结尾的文件
- !lib.iml 表示但lib.iml除外
- test.txt: 忽略当前路径的 test.txt 文件
.gitignore规则不生效
.gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
解决方法就是先把本地缓存删除(改变成未追踪状态),然后再提交修改后的.gitignore:
git rm -r --cached .
git add .
git commit -m '修改.gitignore'
网友评论